• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

🍖事务隔离机制

互联网 diligentman 2个月前 (03-02) 17次浏览

一.事务隔离机制介绍

事务具有原子性、一致性、隔离性、持久性四大特性

隔离性顾名思义指的就是事务彼此之间隔离开, 多个事务在同时处理一个数据时彼此之间互相不影响, 如如果隔离的不够好就有可能会产生脏读、不可重复度、幻读等读现象

二.隔离性的四个级别

1.等级(隔离程度)由低到高

  • Read uncommitted (未提交读)
  • Read committed (提交读)
  • Repeatable read (可重复读) (mysql默认)
  • Serializable (可序列化)

2.依次解决的读现象

  • ✔ : 可能出现

  • ❌ : 不会出现

  脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read(mysql默认) × ×
Serializable × × ×

需要强调的是 : 我们确实可以采用提高事务的隔离级别的方式来解决脏读、不可重复读、幻读等问题, 但与此同时, 事务的隔离级别越高, 并发能力也就越低; 所以, 还需要读者根据业务需要进行权衡

三.四种级别介绍

1.未提交读 (Read uncommitted)

  • 定义

是最低的隔离级别, 在这种事务隔离级别下, 一个事务可以读到另外一个事务未提交的数据

事务在读数据的时候并未对数据加锁

事务在修改数据的时候只对数据增加行级共享锁

  • 现象解释

事务1读取某行记录时, 事务2也能对这行记录进行读取、更新, 并且因为事务一并未对数据增加任何锁

当事务2也对该记录进行更新时, 事务1再次读取该记录, 能读到事务2对该记录的修改版本 (因为事务2只增加了共享读锁, 事务1可以再增加共享读锁读取数据), 即使该修改尚未被提交, 若此时事务2回滚, 那事务1读到的就脏数据了, 这就引发了脏读现象

事务1更新某行记录时, 事务2不能对这行记录做更新, 直到事务1结束 (因为事务1对数据增加了共享读锁, 事务2不能增加排他写锁进行数据的修改)

2.提交读 (Read committed)

  • 定义

可以理解成都已提交, 在一个事务修改数据过程中, 如果事务还没提交, 其他事务不能读该数据

事务对当前被读取的数据增加行级共享锁(读到时才加锁), 一旦读完该行, 立即释放该行行级共享锁

事务在更新某数据的瞬间(在更新的瞬间), 必须先对其加行级排它锁, 直到事务结束才释放

  • 现象解释

事务1在读取某行记录的整个过程中, 事务2都可以对该行记录进行读取 (因为事务一对该行记录增加行级共享锁的情况下, 事务二同样可以对该数据增加共享锁来读数据)

事务1读取某行的一瞬间, 事务2不能修改该行数据, 但是, 只要事务1读取完改行数据, 事务2就可以对该行数据进行修改 (事务一在读取的一瞬间会对数据增加共享锁, 任何其他事务都不能对该行数据增加排他锁; 但是事务一只要读完该行数据, 就会释放行级共享锁, 一旦锁释放, 事务二就可以对数据增加排他锁并修改数据)

事务1更新某行记录时, 事务2不能对这行记录做更新, 直到事务1结束 (事务一在更新数据的时候, 会对该行数据增加排他锁, 知道事务结束才会释放锁, 所以, 在事务二没有提交之前, 事务一都能不对数据增加共享锁进行数据的读取; 所以, 提交读可以解决脏读的现象)

3.可重复读 (Repeatable reads)

  • 定义

由于提交读隔离级别会产生不可重复读的读现象, 所以比提交读更高一个级别的隔离级别就可以解决不可重复读的问题, 这种隔离级别就叫可重复读

事务在读取某数据的瞬间 (就是开始读取的瞬间), 必须先对其加行级共享锁, 直到事务结束才释放

事务在更新某数据的瞬间 (就是发生更新的瞬间), 必须先对其加行级排他锁, 直到事务结束才释放

  • 现象解释

事务1在读取某行记录的整个过程中, 事务2都可以对该行记录进行读取 (因为事务一对该行记录增加行级共享锁的情况下, 事务二同样可以对该数据增加共享锁来读数据)

事务1在读取某行记录的整个过程中, 事务2都不能修改该行数据 (事务一在读取的整个过程会对数据增加共享锁, 直到事务提交才会释放锁, 所以整个过程中, 任何其他事务都不能对该行数据增加排他锁; 所以, 可重复读能够解决不可重复读的读现象)

事务1更新某行记录时, 事务2不能对这行记录做更新, 直到事务1结束 (事务一在更新数据的时候, 会对该行数据增加排他锁, 知道事务结束才会释放锁, 所以, 在事务二没有提交之前, 事务一都能不对数据增加共享锁进行数据的读取; 所以, 提交读可以解决脏读的现象………

展开阅读全文

举报

打赏

0


0 收藏

微信
QQ
微博

分享

作者的其它热门文章

力扣数据库题目176第二高的薪水
八大排序算法-初学笔记
JavaSE 基础大纲
Virtual DOM 简直就是挥霍


程序员灯塔
转载请注明原文链接:🍖事务隔离机制
喜欢 (0)