数据库管理-并发控制

原创 2017年11月06日 09:13:06

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

事务并发执行会产生以下几个问题:
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:在数据集上设置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。

版权声明:本文为博主原创文章,未经博主允许不得转载。

数据库事务和并发控制

一、数据库的事务:      事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是不可分割的一个序列。 事务的特征:(ACID) 1、原子性:事务的操作要么全做要么全不做。 2、一致...
  • u011967405
  • u011967405
  • 2016年06月24日 09:46
  • 3121

数据库并发控制原理详解

数据库并发控制原理 数据库属于公共资源库,当多个事务并发处理数据库数据时,如果控制不当则会造成数据的不一致性,出现数据混乱。对此,数据库引入了锁机制来解决这一问题。为了弄清这个问题,首先要明白为什么多...
  • song19890528
  • song19890528
  • 2013年11月28日 20:59
  • 3694

数据库并发控制知识点总结

刚看到一篇很不错的数据库并发控制知识点总结,包括一部分可能会出现在笔试面试中的题目,适合对基础概念理解不透彻的我,就转载过来了。  原文地址:http://blog.csdn.net/xiangmi...
  • sunsfan
  • sunsfan
  • 2016年08月28日 13:13
  • 1254

数据库并发学习总结

数据库并发控制 1.  在数据库中为什么要并发控制? 答:数据库是共享资源,通常有许多个事务同时在运行。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月30日 13:00
  • 1906

SQL server数据库并发控制--加锁

http://blog.csdn.net/zdplife/article/details/48035837 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作...
  • sinat_26230689
  • sinat_26230689
  • 2016年06月13日 16:40
  • 1248

Oracle的并发控制

并发访问带来的问题 丢失更新:一个事务修改某行数据时,另一个事务同时修改了该行数据,使第一个事务对数据的修改丢失。 脏读:一个事务读取了另一个事务未提交的数据。 不可重复读:一个事务...
  • qq_30398499
  • qq_30398499
  • 2017年05月17日 14:12
  • 315

如何处理大量数据并发操作(数据库锁机制详解)

文件缓存,数据库缓存,优化sql,数据分流,数据库表的横向和纵向划分,优化代码结构!   锁述的概 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:   ...
  • zhouwei1221q
  • zhouwei1221q
  • 2015年08月17日 16:48
  • 2041

数据库的并发控制和封锁协议分析

一、引言 目前主流的关系数据库通常都允许多个用户同时使用和共享,所以也都具有并发控制的机制,也就是控制数据库,防止多用户并发使用数据库时造成数据错误和程序运行错误,以保证数据的完整性。 二、事务与...
  • yellowatumn
  • yellowatumn
  • 2015年11月30日 13:58
  • 1415

Oracle--多用户控制

首先,数据库的用途: - 存储数据 - 多个用户同时使用数据 控制同时发生的多个数据请求是数据库必须完成的一项非常重要的任务。这也使得数据库变得非常复杂。 - 用户希望自己是数据的唯一用...
  • little_nai
  • little_nai
  • 2016年07月01日 15:20
  • 915

数据库事务处理的艺术:事务管理与并发控制---书序

与海翔新书作序 海翔在数据库管理系统领域的第二本著作《数据库事务处理的艺术:事务管理与并发控制》马上就要出版了,他邀请我写个序,我没有犹豫就欣然答应了。事后,我自己都觉得奇怪会这么痛快,但细细想来,...
  • fly2nn
  • fly2nn
  • 2017年11月16日 09:55
  • 224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库管理-并发控制
举报原因:
原因补充:

(最多只允许输入30个字)