Spring事务管理
事务
什么是事务
事务指的是满足ACID特性的一组操作,可以使用Commit提交,也可以使用Rollback回滚。
事务的特性(ACID)
原子性(Atomicity)
事务被视为不可分割的最小单元,事务的所有操作,要么全部提交成功,要么全部失败回滚。
一致性(Consistency)
事务执行的结果,须使数据从一个一致性状态,变为另一个一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。
隔离性(Isolation)
各个事务的执行互不干扰,任何事务的内部操作对其他的事务都是隔离的。
持久性(Durability)
一旦事务提交,其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
并发一致性问题
第一类丢失更新
某一个事务的回滚,导致另外一个事务已更新的数据丢失了。
时刻 | 事务1 | 事务2 |
---|---|---|
T1 | Read: N = 10 | |
T2 | Read: N = 10 | |
T3 | Write: N = 9 | |
T4 | Commit: N =9 | |
T5 | Write: N =11 | |
T6 | Rollback: N = 10 |
第二类丢失更新
某一个事务的提交,导致另外一个事务已更新的数据丢失了。
时刻 | 事务1 | 事务2 |
---|---|---|
T1 | Read: N = 10 | |
T2 | Read: N = 10 | |
T3 | Write: N = 9 | |
T4 | Commit: N =9 | |
T5 | Write: N =11 | |
T6 | Commit: N = 10 |
脏读
某一个事务,读取了另外一个事务未提交的数据。
时刻 | 事务1 | 事务2 |
---|---|---|
T1 | Read: N = 10 | |
T2 | Write: N = 11 | |
T3 | Read: N = 11 | |
T4 | Rollback: N = 10 |
不可重复读
某一个事务,对同一个数据前后读取的结果不一致。
时刻 | 事务1 | 事务2 |
---|---|---|
T1 | Read: N = 10 | |
T2 | Read: N = 10 | |
T3 | Write: N = 9 | |
T4 | Commit: N =9 | |
T5 | Read: N = 9 |
幻读
某一个事务,对同一个表前后查询到的行数不一致。
时刻 | 事务1 | 事务2 |
---|---|---|
T1 | Select: id < 10 (1,2,3) | |
T2 | Insert: id = 4 | |
T3 | Commit: id = {1,2,3,4) | |
T4 | Select: id < 10 (1,2,3,4) |
事务隔离级别
隔离级别 | 第一类丢失更新 | 脏读 | 第二类丢失更新 | 不可重复读 | 幻读 |
---|---|---|---|---|---|
Read Uncommitted | Y | Y | Y | Y | Y |
Read Committed | N | N | Y | Y | Y |
Repeatable Read | N | N | N | N | Y |
Serializable | N | N | N | N | N |