事务是什么?
事务是由一个有限的数据库操作序列构成,这些操作要么都执行要么都不执行。
为什么使用事务?
为了数据最终一致性
事务的特性
- 原子性:一个整体要么全部执行,要么全部不执行
- 一致性:事务开始前结束后数据不被破坏。AB转账最终总额不变
- 隔离性:多个事务并发执行时,相互隔离不干扰
- 持久性:事务提交后,事务所做的操作持久保留在数据库
脏读
一个事务读取另一个事务未提交修改过的数据
- 假设现在A的余额是100,事务A正在准备查询Jay的余额
- 事务B先扣减Jay的余额,扣了10,但是还没提交
- 最后A读到的余额是90,即扣减后的余额
不可重复读
同一个事务前后多次读取数据结果不同
- 事务A先查询Jay的余额,查到结果是100
- 这时候事务B 对Jay的账户余额进行扣减,扣去10后,提交事务
- 事务A再去查询Jay的账户余额发现变成了90
幻读
同一个事务前后查询数据记录结果不同
- 事务A先查询id大于2的账户记录,得到记录id=2和id=3的两条记录
- 这时候,事务B开启,插入一条id=4的记录,并且提交了
- 事务A再去执行相同的查询,却得到了id=2,3,4的3条记录了。
隔离级别
读未提交:只限制不能同时修改一个数据
读已提交:只能读到别人提交的数据
可重复读:读取数据时不能修改
序列化:所有事物串行化执行
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交 | √ | √ | √ |
| 读已提交 | × | √ | √ |
| 可重复读 | × | × | √ |
| 序列化 | × | × | × |
浙公网安备 33010602011771号