ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # 隔离级别 ## 未授权读取 未授权读取也被称为读未提交(Read Uncommitted),该隔离级别允许脏读取,其隔离级别最低. 换句话说,如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有进行事务提交. 而与此同时,允许另一个事务也能够访问该数据. 举个例子:事务A和事务B同时进行,事务A在整个执行阶段,会将某数据项的值从1开始,做一系列加法操作(比如说加1操作)直到变成10之后进行事务提交. 此时,事务B能够看到这个数据项在事务A操作过程中是所有中间值(如1变成2,2变成3).而这一系列的中间操作叫做未授权读取 ## 授权读取 授权读取也被称为读已提交(Read Committed),它和未授权读取非常接近,唯一的区别就是授权读取只允许获取已经被提交的数据 同样拿上面的例子来说,事务A和事务B同时进行,事务A进行与上述同样的操作,此时,事务B无法看到这个数据项在事务A操作过程中的所有中间值,只能看到最终的10. 另外,如果说有一个事务C和事务A进行非常类似的操作,只是事务C是将数据项从10加到20,此时事务B也同样可以读取到20,即授权读取允许不可重复读取 ## 可重复读取 可重复读取,简单的说,就是保证在事务处理过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的. 因此该事务级别禁止了不可重复读取和脏读取,但是有可能出现幻影数据.所谓幻影数据,就是指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果. 在上面的例子,可重复读取隔离级别能够保证事务B在第一次事务操作过程中,始终对数据项读取到1,但是在下一次事务操作中,即使事务B(注意,事务名字虽然相同,但是指的是另一次事务操作),采用同样的查询方式,就可能会读取到10或20 ## 串行化 最严格的事务隔离级别,它要求所有事务都被串行执行,即事务只能一个接一个的进行处理,不能并发执行 # 隔离级别示意图 ![](https://box.kancloud.cn/d3db4b7eeecc64c6184622f262759ac1_1310x905.png) # 隔离级别对比 | 隔离级别 | 脏读 | 可重复读 | 幻读 | | --- | --- | --- | --- | | 未授权读取 | 存在 | 不可以 | 存在 | | 授权读取 | 不存在 | 不可以 | 存在 | | 可重复读取 | 不存在 | 可以 | 存在 | | 串行化 | 不存在 | 可以 | 不存在 | 优先考虑将事务隔离级别设置为授权读取,这能够在避免脏读取的同时保证较好的并发性能. 尽管这种事务隔离级别会导致不可重复读,虚读和第二类丢失更新等并发问题,但较为科学的做法是在可能出现这个类问题的个别场合中,由应用程序主动采用悲观锁或乐观锁来进行事务控制