数据库 之 并发调度

并发控制概述

为保证事务的隔离性和一致性,DBMS需要对并发操作进行正确的调度

并发操作引起的数据库不一致的现象:

丢失修改[ww]
两个事务T1和T2读同一个数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。如下图:

1017814-20170520105524369-41835457.png

不可重复读[rw(r)]
(1)事务T1读取某一数据后,事务T2对其做了修改,当事务T1再读该数据时,得到与前一次不同的值。如下图:

1017814-20170520105944291-257849183.png

(2)事务T1按照一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘的消逝了。
(3)事务T1按照一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。

后两种不可重复读有时候称为幻影现象

读脏数据[wr]
读脏数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一个数据后,T1由于某种原因被撤销(T1回滚),这时T2读到的数据与数据库中的数据不一致,则T2读到了脏数据。

1017814-20170520110817650-325958180.png

封锁

所谓封锁就是事务T再对某个数据对象例如表、记录等操作执行之前,先向系统发出请求,对其加锁,加锁之后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象

排它锁又称写锁。若事务T对数据对象加上X锁,则只允许T读取和修改A,其他任何事务都不能对A加任何数据类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。

共享锁又称读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他任何事务只能再对A加S锁,而不能再加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

读锁和写锁的关系(图为封锁类型的相容关系矩阵):
1017814-20170520112623213-1433184026.png

一级封锁协议

在事务T在修改数据R之前必须现对其加X锁,直到事务结束才释放该锁。
一级封锁协议中,如果是读数据,不需要加锁,它不能保证可重复读和不读脏数据。

1017814-20170520115539119-622981091.png

二级封锁协议

一级封锁协议+事务T在读取数据之前必须加S锁,读完后即可释放S锁。(二级封锁协议可防止读脏数据)

三级封锁协议

一级封锁协议+事务T在读取数据之前必须加S锁,直到事务结束才释放。

转载于:https://www.cnblogs.com/gxcstyle/p/6870113.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值