1 事务的四特性
- 原子性:满足原子操作的单元,要么全部执行成功,要么全部失败
- 一致性:事务开始和完成,其数据必须保持一致
- 隔离性:事务对外不可见
- 持久性:数据的修改是永久的
2 隔离级别
2.1并发引起的问题
- 脏读:A事务还未提交,B就读到了A事务的结果(破坏了隔离性)
- 不可重复读:A事务在本次事务中,最自己未操作过的数据,进行了多次读取,结果出现了这个数据不一致或记录不存在的情况(破坏一致性,在update和delete操作出现)
- 幻读:A事务在本次事务中,最自己未操作过的数据,进行了多次读取,第一次读取时,记录不存在,第二次读取时,记录出现了。(破坏了一致性,insert操作)
2.2解决办法
- 未提交读(READ-UNCOMMITTED) 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- 已提交读(READ-COMMITTED)允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- 可重复读(REPEATABLE-READ)对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- 串行化(SERIALIZABLE)最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读(READ-UNCOMMITTED) | √ | √ | √ |
已提交读(READ-COMMITTED) | × | √ | √ |
可重复读(REPEATABLE-READ) | × | × | √ |
串行化(SERIALIZABLE) | × | × | × |
这四个级别只是一个标准
2.3实现方式(InnoDB)
- 锁机制
RU:不加锁
RC:读到才加行级别共享锁,读完立即释放锁
RR:事务读取时直接加行级别共享锁,事务提交释放锁
SE:事务读取时直接加表级别共享锁,事务提交释放锁 - MVCC机制