事务隔离级别
事务具有原子性、一致性、隔离性、持久性四大特性,而隔离性顾名思义指的就是事务彼此之间隔离开,多个事务在同时处理一个数据时彼此之间互相不影响,如如果隔离的不够好就有可能会产生脏读、不可重复度、幻读等读现象,为此,隔离性总共分为四种级别:由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。
概念介绍
- 脏读:读取到其他事务未提交的数据,未提交意味着这些数据可能会回滚,可能删除,读取到的不是最终的数据;
- 可重复读:在同一个事务中,最开始和结束的任意时刻读取到同样的数据是一致的;
- 不可重复读:同一事务的不同时刻读到的数据不一致,往往是由于其他事务对这数据进行了更新操作;
- 幻读:针对插入操作,A事务对某些内容进行了更改,未提交,B事务插入了与事务A更改前的记录相同的记录行,并在A之前提交,事务A发现刚刚的更改对某些数据没有起作用,但其实是B刚刚插入的数据。
事务隔离级别
SQL定义了四种事务隔离级别:
读未提交
读提交
可重复度
串行化
隔离级别是逐渐增强的,同时并发能力会减弱。
不同的隔离级别可以解决的不同的问题:
隔离级别 | 描述 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
读未提交 | 允许事务读其他事务未提交的修改 | 可能出现 | 可能出现 | 可能出现 |
读提交 | 允许其他事务读已经提交的修改 | 不会出现 | 可能出现 | 可能出现 |
可重复读 | InnoDB默认级别,确保每个事务select输出一致 | 不会出现 | 不会出现 | 可能出现 |
串行化 | 所有事务串行执行 | 不会出现 | 不会出现 | 不会出现 |
读未提交
MySQL的事务隔离是通过加锁实现的,加锁和释放锁都会带来性能开销。
读未提交的事务隔离级别,没有加锁,但是如果读了未提交的数据,事务回滚后就会读到脏数据。
读提交
事务对当前读取的数据加行级共享锁,一旦读完成释放锁;事务更新某数据的时候,加行级排它锁,直到事务结束释放。
因此,更新数据的时候,不能读取了,只有更新事务提交后,才能读取,进而解决了脏读的问题。
可重复读
与读未提交的区别是,读取的时候加行级共享锁,只要读的事务不提交,一直占用着锁,更新操作则不能对数据操作,解决不可重复读的问题。
但是不能解决幻读的问题,因为,在读的事务进行的时候,可以进行插入数据,因此,可能插入前后读取的数据不一致,出现幻读。
序列化
在读取的时候,加上表级共享锁,直到事务结束才释放,更新的时候,加上表级排它锁,事务结束释放。可以解决上述所有问题。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 张国丰!
评论