数据库 事务三重封锁协议和四种隔离级别的关系

排它锁又叫写锁(X锁),事务A对数据D加了排它锁,其它任何事务都不能再对数据D加共享锁或者排它锁。也就是说A可以读取或者修改D,但是其它事务不能读也不能写,但是!!即使数据D加了写锁,其它事务的最基本的select语句还是可以读数据D的,因为最基本的select语句并不用申请任何锁!这个是最迷惑的地方,明白了这一点,一级封锁协议协议会读脏数据就很好理解了。事务A对数据D=1加了排它锁,修改了数据使D=2,这个时候事务B虽然不能对数据D加任何锁,但是可以用select语句读,B读到了数据D=2,之后事务A出错,回滚D=1,那你B就读到了脏数据。
二级封锁协议规定在一级的基础上规定,事务A对数据D加了排它锁,事务B想用基本的select语句读D也必须要申请共享锁(读锁)!!,而一级是不需要的!!,所以B在事务A没结束期间都不能读数据D,这样就不会出现读脏数据了!

两个事务A和B并发
数据:t

错误:

丢失修改:事务A和事务B同时对t进行修改
A读到t为1,B也读到t为1
A让t=t+1=2,B让t=t+2=3
A提交,B提交
最终t=3,事务B导致事务A的丢失修改

不可重复读(教材上):事务A的整个事务过程中,由于事务B对t的操作(已提交),导致对t的查询前后结果不同(A第一次查t——>事务B对t操作——>A第二次查t)
事务B的操作分为增删和修改,增删为幻读,修改为不可重复读

脏读:事务A读事务B对t修改过的数据,但是事务B没有提交,事务A读到后就提交了,然后事务B回滚,导致事务A读到的是错误数据,也是脏数据

三重封锁协议:

一级封锁协议
一级封锁协议是指,事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。

二级封锁协议
二级封锁协议是指,在一级封锁协议基础上增加事务T在读数据R之前必须先对其加S锁,读完后即可释放S锁。二级封锁协议出防止了丢失修改,还可以进一步防止读“脏”数据

三级封锁协议
三级封锁协议是指,在一级封锁协议的基础上增加事务T在读数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议出防止了丢失修改和读“脏”数据外,还可以进一步防止了不可重复读(教材上)(也就是包括不可重复读和幻读)。

四种隔离级别:

第一种隔离级别:Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据(select),该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据(select)

解决了丢失修改
对应一级封锁协议

第二种隔离级别:Read committed(读提交)
如果是一个读事务(线程),则允许其他事务读(加S锁),如果是写事务将会禁止其他事务访问该行数据(加X锁),该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据(提交,因为二级封锁协议读完后即可释放S锁),事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

解决了丢失修改脏读
对应二级封锁协议

第三种隔离级别:Repeatable read(可重复读取)
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。

解决了丢失修改、脏读、不可重复读

第四种隔离级别:Serializable(可串行化)
提供严格的事务隔离,它要求事务串行化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读

解决了丢失修改、脏读、不可重复读、幻读
对应三级封锁协议
在这里插入图片描述

https://www.zhihu.com/question/23120196

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值