[数据库管理]-并发控制

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://david.blog.csdn.net/article/details/78454308

一、并发操作中存在的问题

事务并发执行会产生以下几个问题:
1. 丢失修改:两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改丢失。
2. 读“脏数据”:事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因撤销,这时T1修改过的数据恢复原值,T2得到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据,即不正确的数据。
3. 不能重复读:事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果
二、封锁技术

所谓封锁是在一段时间内禁止某些用户对数据对象做某些操作,以避免产生数据的不一致性问题。只有当一个事务在一个数据项持有某种锁时,才允许改事务访问这个数据。
封锁一般有排它锁定(X锁)和共享锁(S锁)两种类型。如果事务T获得了数据项Q上的排它锁,既可以读写Q又可写Q,其他事务在Q上既不能加X锁也不能加S锁。如果事务T获得了数据项Q上的共享锁,则T可读Q但不能写Q,其他事务在Q上可以加S锁,但不能加X锁。每个事务要根据自己将对数据项Q进行的操作申请适当的锁,该请求发送给并发控制管理器只有在并发管理器授予所需要的锁之后,事务才能继续其操作。

三、可串行化

假设若干相互独立的事务在单独执行时结果正确,则将他们按照一定顺序构成事务集后,这些事务顺序执行(称为串行操作)的结果也不正确。当这些事务并发执行时,采用分时的方法同时处理多个事务,成为并行操作,该操作与串行操作的结果不一定相同。通常把确定事务运行顺学的具体步骤成为调度,如果一个并行调度的结果等价与某一串行操作调度执行的结果,则将这种调度成为可串行化调度

四、死锁

  1. 多个事务并发执行,每个事务都申请其他事务已经封锁了的对象,这些申请无法满足,从而使得这些事务永远不能结束
  2. 数据库系统有若干个长时间运行的事务在执行并行的操作,当查询分析处理一种非常复杂的连接查询时,由于不能控制处理的顺序,有可能发生死锁。

    解决方法:

  3. 预防法,常用的有一次封锁法和顺序封锁发。一次封锁法是要求每一个事务必须将所有要使用的数据全部加锁,否则就不能继续执行。顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按照这个顺序封锁。这两种方法的缺陷在于事务的封锁请求随事务的执行而动态变化,所以很难确定枷锁对象及顺序。

  4. 诊断解除法,常用的有超时法和等待图法。超时法的是如果一个事务等待时间超过了规定的期限,就认为发生了死锁。等待图法是用一个有向图动态地反应所有事务的等待情况,系统周期性地检测等待图,如果发现图中存在回路,则表示系统中出现了死锁。

五、封锁协议
在多个事务并发执行的系统中,主要采取封锁协议来处理

  1. 一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放,一级封锁协议可防止丢失修改,并保证事务T是可恢复的,但不能保证可重复读和不读“脏”数据
  2. 二级封锁协议:在一级封锁协议的基础上增加事务T在读取数据R之前先对其加S锁,读完后即可释放S锁。二级封锁协议可防止丢失修改,还可防止读“脏”数据,但不能保证可重复读
  3. 三级封锁协议:在一级封锁协议的基础上增加事务T在读取数据R之前先对其加S锁,直到事务结束才释放。三级封锁协议可防止丢失修改,还可防止读“脏”数据与保证可重复读
  4. 两段锁协议:所有事务必须分两个阶段对数据项加锁和解锁。其中,扩展阶段是在对任何数据进行读写操作之前,首先要申请并获得对该数据的封锁;收缩阶段是在释放一个锁之后,事务不能再申请和获得任何其他封锁。若并发执行的所有事务均遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的,但不能保证不发生死锁。

    六、隔离级别
    当事务接受不一致的数据级别时称为事务的隔离级别。如果事务的隔离级别比较低,会增加事务的并发问题,有小弟设置事务的隔离级别可以降低并发问题的发生,在SQL SERVER中,可使用下述语句设置事务的格力级别
    SET TRANSACTION ISOLATION LEVEL
    {
    READ COMMITTED|READ UNCOMMITTED
    REPEATABLE READ|SERIALIZABLE
    }

    1.READ COMMITTED:指定在读取数据时加共享锁以避免读“脏”数据,但数据可在事务结束前修改,从而产生不可重复读取或幻想读取改数据,改选项是SQL SERVER的默认值
    2.READ UNCOMMITTED:执行脏读或0级隔行锁定,这表示不发出共享锁,也不接受排他锁。该选项的作用在于事务内所有的表上设置UNLOCK相同这是4个隔离级别中限制最小的级别
    3.REPEATABLE READ:锁定查询中使用的所有数据,以防止其他用户更新数据,但其他用户可以将心得数据插入数据集,从而在当前事务的后继读取中出现新的数据,产生幻想读。因为并发地域默认隔离级别,所以必要时才使用该选项
    4.SERIALIZABLE:在数据集上设置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。

展开阅读全文

没有更多推荐了,返回首页