数据库并发控制

  首先,明确数据库中并发控制的基本单位是事务

  为了保证事务的隔离性一致性,数据库管理系统需要对并发操作进行正确的调度。

  我们先从数据库并发操作会带的来问题开始分析:

  1.丢失操作(lost update)

          当两个事务T1和T2同时读取同一数据并修改,T1提交的结果破坏了T2提交的结果,导致T2的修改被丢失。

  2.不可重复读(non-repeatable read)

        当事务T1读取数据后,事务T2执行更新操作,使T1重复读取时无法重现第一次读取的数据结果。

        具体分为:

             当事务T1读取某一数据后,事务T2对其进行了修改,当事务T1重复读取该数据时,得到与前一次读取不同的结果。

             当事务T1读取某一数据后,事务T2对其进行了删除,当事务T1重复读取该数据时,得到与前一次读取不同的结果。

             当事务T1读取某一数据后,事务T2对其进行了修改,当事务T1重复读取该数据时,得到与前一次读取不同的结果。

             后两种情况有时也成为“幻影(phanton row)”现象。

  3.读“脏”数据(dirty data)

            当事务T1对数据进行读取修改,并返回。此时事务T2读取统一数据之后,事务T1由于某种原因被撤销,导致原来修改的数据恢复成原值。则事务T2读取的结果与数据库存在的数据不一样,即 错误 的数据。则事务T2读取的数据被称为脏数据。

            

      产生上述三类数据不一致性的主要原因时并发操作破坏了事务的隔离性。并发控制机制就时要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰。

      并发控制的主要技术有封锁(locking), 时间戳(timestamp), 乐观控制法(optimistic scheduler) 和 多版本并发控制(multi-version concurrency control, MVCC)等。

        

       我们本次文章主要论述封锁技术。

        基本的封锁类型有两种:排他锁(exclusive locks 简称“X”锁), 共享锁(share locks 简称“S”锁)。

        排他锁又称锁。若事务T对数据对象A加上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做任何的修改。

 

        封锁协议

        1.一级封锁协议

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

           比如事务T1在读A进行修改之前先对A加X锁,当事务T2再请求对A加X锁时被拒绝,只能等待T1释放A上的锁后获得对A的X锁,这时它读到的A已经是更新过的值。

        2.二级封锁协议

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

             事务T1在对A进行修改之前,先对A加X锁,修改其值后返回磁盘,这时T2请求在A上加S锁,因T1已经在A上加了X锁,T2只能等待。T1因某原因撤销后,A恢复为原值,T1释放A上的X锁,T2才能获取A上的S锁并取值。

        3.三级封锁协议

            指在一级封锁协议基础上增加事务T在读取数据R之前必须先对其加S锁,事务结束后即可释放S锁。解决了三种并发一致性带来的问题。

        比如事务T1在读取A,B之前,先对A,B加X锁,这样其他事务只能再对A,B加S锁,而不能加X锁,即其他事务只能读取A,B,而不能修改他们。所以当T2为修改B而申请对B的X锁时被拒绝,只能等待T1释放B的锁。T1为再验算A,B,这时读取来的依然是原值,即可重复读。T1结束后释放A,B上的S锁,T2才能获得对B的X锁。


        

        活锁和死锁:

        活锁是指,事务T1封锁了数据A,事务T2又申请封锁,但是此时被T1封锁,所以T2等待。T3此时也申请封锁A,当T1释放了A上的锁,又优先批准了T3的请求,T2仍然等待。然后T4有申请封锁,当T3释放,又批准了T4的申请。以此类推,T2可能会永远等待。这就是活锁

        死锁是指,事务T1封锁了数据A,事务T2封锁了数据B。而T1又申请封锁数据B,T2又申请封锁数据A,而A已被T1封锁,所以T2只能等待,B又已经被T2封锁,T1也只能等待。于此并出现了T1与T2永远等待,最后形成死锁的情景。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值