一、事务概述
1.简述
- 事务(Transaction)是由一系列对系统中数据进⾏访问与更新的操作所组成的⼀个程序执行逻辑单元。
2.语法
mysql>begin;
mysql>start transaction;
mysql>commit;
mysql>rollback;;
3.特性(ACID)
- 原⼦性(Atomicity)
事务是一个原子的操作序列单元;执行一个事务时,此事务中的所有操作不是全部执行成功,就是全部执行失败。 - ⼀致性(Consistency)
事务执行后,数据库数据会对应事务的操作进行修改,保证数据库一致性状态。 - 隔离性(Isolation)
并发环境中,并发的事务是互相隔离的;不同事务并发操作相同数据时,每个事务都有各自完整的数据空间。 - 持久性(Duration)
事务提交后,事务修改的数据会永久保存到数据库中;即便服务器崩溃、宕机,只要重启数据库就能恢复到事务成功结束后的状态。
二、并发问题
1.脏读
- 读到了没有提交的数据。

2.不可重复读
- 同一条命令,返回不同结果集。

3.幻读
- 重复查询时,数据发⽣了量的变化(insert,delete)。
- 指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。
三、隔离级别
1.简述
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|
读未提交(READ_UNCOMMITTED) | 允许 | 允许 | 允许 |
读已提交(READ_COMMITTED) | 禁止 | 允许 | 允许 |
可重复读(REPEATABLE_READ) | 禁止 | 禁止 | 可能出现 |
顺序读(SERIALIZABLE) | 禁止 | 禁止 | 禁止 |
- 四种隔离级别越往下,级别越高、安全性越强、并发性越差。
- 查询当前会话中的事务隔离级别
mysql>select @@tx_isolation;
mysql>select @@transaction_isolation;
mysql>set session transaction isolation level REPEATABLE READ;
2.读未提交(READ_UNCOMMITTED)
- 隔离级别最低,允许脏读。
- 脏读:如果一个事务正在处理某一数据,并对其进⾏了更新,但同时尚未完成事务,目前还没有提交事务;与此同时,允许另一个事务也能够访问该数据。
出现脏读示例:
时间 | 事务A(存) | 事务B(取) |
---|
T1 | 开始事务 | —— |
T2 | —— | 开始事务 |
T3 | —— | 查询余额(1000元) |
T4 | —— | 取出1000元(余额0元) |
T5 | 查询余额(0元) | —— |
T6 | —— | 撤销事务(余额恢复1000元) |
T7 | 存入500元(余额500元) | —— |
T8 | 提交事务 | —— |
3.读已提交(READ_COMMITTED)
- 不同的事务执行的时候只能获取到已经提交的数据。
- 避免了脏读,但是会出现不可重复的问题。
出现不可重复读示例:
时间 | 事务A(存) | 事务B(取) |
---|
T1 | 开始事务 | —— |
T2 | —— | 开始事务 |
T3 | —— | 查询余额(1000元) |
T4 | 查询余额(1000元) | —— |
T5 | —— | 取出1000元(余额0元) |
T6 | —— | 提交事务 |
T7 | 查询余额(0元) | —— |
T8 | 提交事务 | —— |
4.可重复读(REPEATABLE_READ)
- 保证在事务处理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。
- 限制了不可重复读和脏读,但是有可能出现幻读的数据。
出现幻读示例:
时间 | 事务A | 事务B |
---|
T1 | 开始事务 | —— |
T2 | 查询当前所有数据 | 开始事务 |
T3 | —— | 插入一条数据 |
T4 | 查询当前所有数据 | 提交事务 |
T5 | 进行范围修改 | —— |
T6 | 查询当前所有数据 | —— |
T7 | 提交事务 | —— |
5.顺序读(SERIALIZABLE)
- 是最严格的事务隔离级别,它要求所有事务排队执行,事务不可并发。
6.各隔离级别的锁的情况
- 读未提交(RU):有行级的锁,没有间隙锁。它与RC的区别是能够查询到未提交的数据。
- 读已提交(RC):有行级的锁,没有间隙锁,读不到没有提交的数据。
- 可重复读(RR):有行级的锁,也有间隙锁,每次读取的数据都是一样的,并且无幻读情况。
- 序列化(S):有行级锁,也有间隙锁,读表的时候,就已经上锁了