CSNotesCSNotes
TODO
LeetCode
数据结构
计算机组成原理
操作系统
计算机网络
数据库
Java
SSM
React
实用工具
GitHub
TODO
LeetCode
数据结构
计算机组成原理
操作系统
计算机网络
数据库
Java
SSM
React
实用工具
GitHub
  • 第一章 SQL语法

    • 1.1 数据库
    • 1.2 MySQL 语法
    • 1.3 查询
    • 1.4 什么是 join?
    • 1.5 LIKE 操作符
    • 1.6 分组
    • 1.7 字段都有哪些属性
  • 第二章 了解 SQL

    • 2.1 数据库基础
    • 2.2 数据库范式
    • 2.3 字符集
    • 2.4 数据库概念
    • 2.5 最大行大小
  • 第三章 数据库概念

    • 3.1 一条 SQL 语句是如何执行的?
    • 3.2 InnoDB 行格式
    • 3.3 为什么数据库 VARCHAR 字段上限是 16383?
  • 第四章 数据库数据结构

    • 4.1 数据库数据结构
  • 第五章 索引

    • 5.1 索引
    • 5.2 一个 B+ 树中大概能存放多少条索引记录?
  • 第六章 范式

    • 6.1 范式
  • 第七章 日志

    • 7.1 日志
  • 第八章 事务

    • 8.1 事务简介
    • 8.2 事务
  • 第九章 InnoDB 页

    • 9.1 InnoDB 页
  • 第十章 常见面试题

    • 10.1 数据库存储索引为什么不用二叉排序树,不用红黑树,而用 B+ 树?
    • 10.2 为什么 InnoDB 中 B+ 树一个结点的页设置为 16KB

8.2 事务

事务的起源

小明向小李发了一个 10 元微信红包,小李收下了。在现实世界中,可能大家都会觉得,小明 -10 元,小李 +10 元,但是有没有可能,小李没收到钱,小明却 -10 元呢?为了保证公平性,+10 元和 -10 元要么都进行,要么都不执行。

原子性

隔离性

就像操作系统中所说,进程具有异步性,和数据库中的事务正好相反。

事务的不同状态

活动的(active):

部分提交的(partially commited):事务操作完成了,但数据所造成的影响还没刷新到磁盘。

失败的(failed):

中止的(aborted):回滚到了执行事务之前的状态,相当于什么都没做。

提交的(commited):修改的数据刷新到磁盘

事务的四种隔离级别

串行化(SERIALIZABLE):当串行化事务读取某些数据后,这些数据将不能被其他事务更改,但可以被读取,直到本事务结束。

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE ;
START TRANSACTION ;
SELECT * FROM TIME WHERE A = 1;
DO SLEEP(7);
COMMIT;
SELECT * FROM TIME WHERE A='1';
UPDATE TIME SET B='1000' WHERE A='1';
SELECT '已将B设为1000'

可重复读(REPEATABLE READ):串行化读取数据后,会阻止其他事务更改这些数据,而可重复读允许其他事务修改数据,但不可见。

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION ;
SELECT * FROM TIME WHERE A = 1;
DO SLEEP(7);
SELECT * FROM TIME WHERE A = 1;
COMMIT;
UPDATE TIME SET B='1000' WHERE A='1';

读已提交:在读已提交事务中,你可以读取到,其他事务对数据已经提交的更改,但会忽视其他事务未提交的更改,以确保读取的数据的合理性。

比如,某个用于修改用户姓名的事务,当用户姓名合理时,该事务提交,不合理时,事务将执行回滚。我们可以使用读已提交事务,只读取上述事务提交的更改,以确保读取到的用户姓名始终是合理的。

SET SESSION TRANSACTION ISOLATION LEVEL  READ COMMITTED ;
START TRANSACTION ;
SELECT B FROM TIME WHERE A = 1;
COMMIT;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION ;
UPDATE TIME SET B=1000 WHERE A=1;
SELECT 'B设为1000';
DO SLEEP(7);

COMMIT ;

读未提交:

SET SESSION TRANSACTION ISOLATION LEVEL  READ UNCOMMITTED ;
START TRANSACTION ;
SELECT B FROM TIME WHERE A = 1;
COMMIT;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION ;
UPDATE TIME SET B=1000 WHERE A=1;
SELECT 'B设为1000';
DO SLEEP(7);

ROLLBACK ;
编辑此页
上次更新:
Prev
8.1 事务简介