精华内容
下载资源
问答
  • 并发控制

    千次阅读 2018-08-02 18:17:07
    所谓事务,是指用户定义的一个数据库操作序列,这些操作要么全做,要么全不做...事务是并发控制的基本单位,保证事务ACID特性是事务处理的重要任务。 并发操作带来的数据的不一致性问题: 1.丢失修改 两个事务T1...

    所谓事务,是指用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
    事务具有四个特性:
    1.原子性 2.一致性(Consistency) 3.隔离性(Isolation)持续性(Durability)

    并发控制概述

    事务是并发控制的基本单位,保证事务ACID特性是事务处理的重要任务。
    并发操作带来的数据的不一致性问题:
    1.丢失修改
    两个事务T1和T2读入同一组数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。
    2.不可重复读
    不可重复读是指事物T1读取数据后,事务T2执行更新操作,使T1无法再前一次读取的结果。不重复读包括三种结果:
    (1)事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时,得到与前一次不同的值。
    (2)事务T1按一定条件从数据库中读取某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘消失了。
    (3)事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按照相同条件读取数据时,发现多了一些记录。
    后两种不可重复读有时也称为幻影现象。
    3.读脏数据(Dirty Read)
    读脏数据是指事物T1修改某一数据,并将其写会磁盘,事物T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改过的数据被恢复原值,T2读到的数据与数据库中的数据不一致,则T2读到的数据就为“脏数据”。
    产生上述三类数据不一致的主要原因是并发操作破坏了事务的隔离性。
    并发控制的主要技术有封锁(Locking)、时间戳(Timestamp)和乐观控制法,商用的DBMS一般都采用封锁方法。

    封锁

    所谓封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。
    基本的封锁类型有两种:
    1.排它锁(Exclusive Locks),简称X锁
    2.共享锁(Share Locks),简称S锁
    排它锁又称写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。
    共享锁又称读锁。若事务T对数据对象A加上S锁,则事务T可以读A但是不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。

    活锁和死锁

    活锁

    如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的锁后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求…T2有可能永远等待下去,这就是活锁的情形。
    避免活锁采用的方法是先来先服务的策略。

    死锁

    1.死锁的预防

    通常有两种方法:1.一次封锁法 2.顺序封锁法
    一次封锁法:要求每个事务必须一次性将所有要使用的数据全部加锁,否则就不能继续执行。
    存在问题:1.一次就讲以后要用到的全部数据加锁,扩大了封锁的范围,从而降低了系统的并发度。
    2.数据库中的数据是不断变化的,原来不要求封锁的数据,在执行过程中可能会变成封锁对象,所以很难先景区地确定每个事务索要封锁的数据对象。
    顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
    存在问题:1.数据库系统中封锁的数据对象极多,并且随数据的插入、删除等操作不断变化,要维护这样的资源的封锁顺序非常困难,成本很高。
    2.事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁那些对象,因此也很难按规定的顺序去施加封锁。
    DBMS在解决死锁的问题上普遍采用的是诊断并解除死锁的方法

    2.死锁的诊断与解除

    1.超时法
    如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。
    不足:1.有可能误判死锁,事务因为其他原因使等待时间超过时限,系统会误认为发生了死锁。
    2.时限若设置得太长,死锁发生后不能及时发现。
    2.等待图法
    事务等待图是一个有向图G=( T, U).T为结点的集合,每个结点表示正在运行的事务,U为边的集合,每条边表示事务的等待情况。
    事务等待情况动态反应了所有事务的等待情况。并发控制子系统周期性地生成事务等待图,并进行检测。如果发现图中存在回路,则表示系统中出现了死锁。
    DBMS的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有的锁,使其他事务得以继续运行下去。

    并发调度的可串行性

    DBMS对并发事务不同的调度可能会产生不同的结果,那么什么样的调度是正确的呢?显然,串行调度是正确的。执行结果等价于串行调度的调度也是正确的。这样的调度叫可串行化调度。

    可串行化调度

    定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行的执行这些事务时的结果相同,称这个调度策略是可串行化的。
    可串行性是并发事务正确执行的准则。

    冲突可串行化调度

    冲突操作是指不同的事务对同一个数据的读写操作和写写操作:
    Ri(x)与Wj(x) //事务Ti读x,Tj写x
    Wi(x)与Wj(x) //事务Ti写x,Tj写x
    其他操作是不冲突操作。
    一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc’,如果Sc’是串行的,称调度Sc为冲突可串行化的调度。一个调度是冲突可串行化,一定是可串行化的调度。
    冲突可串行化调度是可串行化调度的充分条件,不是必要条件。还有不满足冲突可串行化条件的可串行化调度。

    两段锁协议

    在运用封锁方法时,对数据对象加锁时需要约定一些规则,例如何时申请封锁、持所时间、何时释放封锁等。这些规则被称为封锁协议。
    所谓两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁:
    1.在对任何数据进行读、写操作之前,首先要申请并获得对该数据的加锁
    2.在释放一个封锁之后,事务不再申请和获得任何其他封锁
    两段锁的含义是,事务分为两个阶段,第一个阶段是获得封锁,也称为扩展阶段。在这阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。第二个阶段是释放封锁,也称为收缩阶段。在这阶段,事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁。
    事务遵守两段锁协议是可串行化的充分条件,而不是必要条件。
    要注意两段锁协议和防止死锁的一次封锁法的异同之处。一次封锁法要求每个事物必须一次将所有要使用的数据全部加锁,否则就不能继续执行。因此一次封锁遵守两段锁协议;但是两段锁协议并不要求事务必须将所有要是有的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁。

    封锁的粒度

    封锁对象的大小称为封锁粒度。封锁对象可以是逻辑单元,也可以是物理单元。以关系数据库为例,封锁对象可以是这样一些逻辑单元:属性值、属性值的集合、元组、关系、索引项、整个索引直至整个数据库;也可以是这样一些物理单元:页、物理记录等。
    如果在一个系统中同时支持多种封锁粒度供不同的事务选择是比较理想的,这种封锁方法称为多粒度封锁。

    多粒度封锁

    多粒度树:多粒度树的根节点是整个数据库,表示最大的数据粒度。叶节点表示最小的数据粒度。
    多粒度封锁协议允许多粒度树种的每个节点被独立地加锁。对一个结点加锁意味着这个结点的所有后裔结点也被加以同样类型的锁。因此,在多粒度封锁中一个数据对可能一两种方式加锁,显示封锁和隐式封锁。
    显示封锁是应事务的要求直接加到数据对象上的封锁;
    隐式封锁是该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁。
    一般地,对某个数据对象加锁,系统要检查该数据对象是哪个有误显示封锁与之冲突;还要检查其所有上级结点,看本事务的显示封锁是否与该数据对象上的隐式封锁冲突;还要检查所有下级结点,看上面的显示封锁是否与本事务的隐式封锁冲突。

    意向锁

    意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对他的上层结点加意向锁。
    意向共享锁(IS锁)、意向排它锁(IX锁)、共享意向排它锁(SIX锁)
    IS锁
    如果对一个数据对象加S锁,表示它的后裔结点拟(意向)加S锁。
    IX锁
    如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁。
    SIX锁
    如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX= S+IX。
    具有意向锁的多粒度封锁方法中任一事务T要对一个数据对象加锁,必须先对它的上层结点加意向锁。申请封锁时应该按自上而下的次序进行;释放封锁时应该按自下而上的顺序进行。

    基于时间戳的协议

    另一种决定事务可串行化次序的方法是事先选定事务的次序。其中最常用的方法是时间戳排序机制。

    时间戳

    对于系统中每个事务Ti,我们把一个唯一的固定时间戳和它联系起来,此时间戳记为TS(Ti)。该时间戳是在事务Ti开始执行前由数据库系统赋予的。若事务Ti已赋予时间戳TS(Ti),此时有一种新事务Ti进入系统,则TS(Ti) < TS(Tj)。实现这种机制可以采用下面这两个简单的办法:
    1.使用系统时钟的值作为时间戳:即事务的时间戳等于该事务进入系统时的时钟值。
    2.使用逻辑计数器,每赋予一个时间戳,计数器增加计数,即事务的时间戳等于该事务进入系统时的计数器值。
    要实现这个机制,每个数据项Q需要与两个时间戳值相关联:
    W-timestamp(Q)表示成功执行write(Q)的所有事务的最大时间戳
    R-timestamp(Q)表示成功执行read(Q)的所有事务的最大时间戳。

    时间戳排序协议

    保证任何有冲突的read或write操作按时间戳顺序执行。该协议运作方式如下:
    1.假设事务Ti发出read(Q)
    a.若TS(Ti) < W-timestamp(Q),则Ti需要读入的Q值已经被覆盖。因此,read操作被拒绝。Ti回滚。
    b.若TS(Ti)>=W-timestamp(Q),则执行read操作,R-timestamp(Q)被设置为R-timestamp(Q)与TS(Ti)两者的最大值。
    2.假设事务Ti发出write(Q)
    a.若TS(Ti) < R-timestamp(Q),则Ti产生的Q值是先前所需要的值,且系统已假定该值不会再产生。因此,write操作被拒绝,Ti回滚。
    b.若TS(Ti) < W-timestamp(Q),则Ti时图写入的Q值已经过时。因此,write操作被拒绝,Ti回滚。
    c.其他情况,系统执行write操作,将W-timestamp(Q)设置为TS(Ti)。
    如果事务Ti由于发出read或write操作而被并发控制机制回滚,则系统赋予它新的时间戳并重新启动。
    时间戳排序协议保证冲突可串行化,这因为冲突操作按时间戳顺序进行处理。
    该协议保证无死锁,因为不存在等待的事务。但是,当一系列冲突的段事务引起长事务反复重启时,可能导致肠事务饿死的现象。如果发现一个事务反复重启,与之冲突的事务应当暂时阻塞,以使该事务能够完成。
    该协议可能产生不可恢复的调度。然而,该协议可以进行扩展,用以下几种方法之一来保证调度可恢复:
    1.在事务末端执行所有的写操作能保证可恢复性和无级联性,这些写操作必须具有下述意义的原子性:在写操作正在执行的过程中,任何事物都不允许访问已写完的任何数据项。
    2.可恢复性和无级联性也可以通过使用一个受限的发封锁形式来保证,由此,对未提交数据项的读操作被推迟到更行该数据项的事务提交之后。
    3.可恢复性可以通过跟踪为提交写操作来单独包装,一个事物Ti读取了其他事物所写的数据,只有在其他事物都提交之后,Ti才能提交。

    基于有效性检查的协议

    有效性检查协议要求每个事物Ti在其生命周期中按两个或三个阶段执行,则取决于事务是一个只读事务还是一个更新事务。
    1.读阶段:在这一阶段中,系统执行事务Ti。个数据项值被读入并保存在事务Ti的局部变量中。所有write操作都是对局部临时变量进行的,并不对数据库进行真正的更新。
    2.有效性检查阶段:对事务Ti进行有效性测试,判断是否可以执行write操作而不违反可串行性。如果事务有效性测试失败,则系统终止这个事务。
    3.写阶段:若事务Ti已通过有效性检查,则保存Ti任何写操作结果的临时就被变量值被复制到数据库中。只读事务忽略这个阶段。
    为了进行有效性检测,我们需要知道事务Ti的各个阶段何时进行。为此,我们将三个不同的时间戳与事务Ti相关联。
    1.Start(Ti):事务Ti开始执行的时间
    2.Validation(Ti):事务Ti完成读阶段并开始其有效性检查的时间
    3.Finish(Ti):事务Ti完成写阶段的时间
    我们利用时间戳Validation(Ti)的值,通过时间戳排序技术决定可串行性排序。因此,值TS(Ti) = Validation(Ti)。并且若TS(Tj) < TS(Tk),则产生的任何调度必须等价于事务Tj出现在Tk之前的某个串行调度。选择Validation(Ti)而不是Start(Ti)作为事务Ti的时间粗是因为在冲突频度很低的情况下期望有更快的响应时间。
    事务Ti的有效性测试要求任何满足TS(Tk) < TS(Tj),的事务Tj必须满足下面两条件之一:
    1.Finish(Tk) < Start(Tj)。因为Tk在Tj开始之前完成其执行,所以可串行性次序得到了保证
    2.Tk缩写的数据项集与Tj所读数据项集不相交,并且Tk的写阶段在Tj开始其有效性检查阶段之前完成。这个条件保证Tk与Tj的写不重叠。因为Tk的写不影响Tj的读,又因为Tj不可能影响Tk的读,从而保证了可串行性次序。
    在有效性检查机制中,由于事务乐观的执行,假定他们能够完成执行并且最终有效,因此也称为乐观的并发控制机制。与之相反,封锁和时间戳排序是悲观的,因为当他们检测到一个冲突时,它们强迫事务等待或回滚,即使该调度有可能是冲突可串行的。

    展开全文
  • 数据库并发控制技术

    千次阅读 2018-08-25 14:27:19
    事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元,也是恢复和并发控制的基本单位。 事务处理技术主要包括数据库恢复技术和并发控制技术。本篇博文主要总结下并发控制技术。 事务:是用户定义的一个...

    事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元,也是恢复和并发控制的基本单位。

    事务处理技术主要包括数据库恢复技术并发控制技术。本篇博文主要总结下并发控制技术。

    事务:是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。例如,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。一般来说,一个程序中包含多个事务。

    ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:

    A:原子性(Atomicity): 事务是一个或多个行为捆绑在一起组成一个单独的工作单元,事务中的动作要不都发生,要不都不发生。

    C:一致性(Consistent): 即在事务开始之前和结束之后,数据库的完整性约束没有被破坏。

      数据库层面:在一个事务执行前和执行后,数据会符合你设置的约束(例如unique约束,foreign key约束,check约束等)和触发器设置.由数据库进行保证.

      业务层面:保持业务的一致性.需要由开发人员进行保证.

    I:隔离性(Isolation):指的是在并发环境中,事务之间互相影响的程度(即并发事务间数据的可见程度).当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间.由并发事务所做的修改必须与任何其他并发事务所做的修改隔离.事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据.。

    D:持续性(Durability): 也叫永久性,指一旦事务完成,事务的结果应该持久化,用来保证即使系统崩溃也不会破坏事务的结果。

    保证事务ACID特性是事务管理的重要任务。事务ACID特性可能遭到破坏的因素有:

    (1)多个事务并行运行时,不同事务的操作交叉执行。

    (2)事务在运行过程中被强行停止。

    并发操作带来的数据不一致性包括丢失修改、不可重复读和读“脏”数据。

    No.1 丢失修改(或叫丢失更新)

    如果两个事务都要更新数据库一个字段X,X=100;

    事务A事务B
    读取X=100 读取X=100
    写入x=X+100写入x=X+200
    事务结束x=200 事务结束x=300
     最后x=300
     

    两个不同的事务同时获得了相同的数据,又都对这个数据进行了修改,那么先提交的事务的更新就会被后提交事务的更新覆盖掉,叫做丢失更新。

    No.2 不可重复读

    一个事务执行期间,在自己没有更新数据库的情况下,同一个查询操作在执行一次或多次的情况下,结果应该是一致的。

    事务A事务B
    读取X=100读取X=100
    读取X=100 写入x=X+100
     事务结束, x=200
    读取X=200
    (此时,在同一个事务A中,读取的X值发生了变化!)
     
    事务结束 
     

    这种情况事务A多次读取数据出现不一致的结果。

    摘自王珊老师的《数据库系统概论》(第5版)的解释:不可重复读包括三种情况(后两种情况也称为幻影现象或幻读):

    (1):事务T1读取某一数据之后,事务T2对其进行了修改,当事务T1再次读该数据时,得到与前一次不同的值.如上所示。

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

    (3):事务T1按一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按照相同条件读取数据时,发现多了一些记录。

    No.3 脏读(读脏数据,未提交读)

    事务A   事务B
     写入x=X+100 (x=200)
    读取X=200 (读取了事务B未提交的数据)   
     事务回滚x=100 
     事务结束x=100
    事务结束

    事务读取了未提交的数据,如图 事务B可能出现未提交或者提交不成功的情况而进行回滚,这就导致事务A读取了错误的数据,也叫脏数据。

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

    下面主要讲封锁方法。

    封锁是实现并发控制的一个非常重要的技术。基本的封锁类型有两种:排他锁(X锁)共享锁(S锁)。

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

    共享锁又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事物只能再对A加S锁,而不能加X锁。

    在运用 排他锁 和 共享锁 对数据对象加锁时,还需要约定一些规则,例如何时申请 排他锁 或 共享锁、持锁时间、何时释放等。称这些规则为封锁协议(Locking Protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。不同的封锁协议对应不同的隔离级别

    在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同:

    A. 未授权读取(Read uncommited):允许脏读取,但不允许丢失修改。

    对应一级封锁协议:一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。 

    B. 授权读取(Read Committed):允许不可重复读取,但不允许脏读取和丢失修改。这可以通过“瞬间共享读锁”和“排他写锁”实现。

    对应二级封锁协议:二级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁(瞬间S锁)。

    C. 可重复读取(Repeatable Read):禁止不可重复读取和脏读取和丢失修改,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。

    对应三级封锁协议:三级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放

    D. 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。

     四级封锁协议是对三级封锁协议的增强,其实现机制也最为简单,直接对事务中所读取或者更改的数据所在的表加表锁,也就是说,其他事务不能读写该表中的任何数据。这样所有的脏读,不可重复读,幻读,都得以避免!

     

    展开全文
  • 数据库并发控制及SQL Server的 并发控制机制 在多用户和网络环境下,数据库是一个共享资源,多个用户或应用程序同时对数据库的同一数据对象进行读写操作,这种现象称为对数据库的并发操作。显然并发操作可以充分...

    数据库并发控制及SQL Server的

    并发控制机制

    在多用户和网络环境下,数据库是一个共享资源,多个用户或应用程序同时对数据库的同一数据对象进行读写操作,这种现象称为对数据库的并发操作。显然并发操作可以充分利用系统资源,提高系统效率。虽然如此,但是如果对并发操作不进行控制会造成一些错误。对并发操作进行的控制称为并发控制。并发控制机制是衡量一个DBMS的重要性能指标之一。

    10.1 事务及并发控制的基本概念

    10.1.1 事务的概念

    所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。例如,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。事务和程序是两个概念。一般地讲,一个程序中包含多个事务。

    事务的开始与结束可以由用户显式定义。如果用户没有显式地定义事务,则由DBMS按默认自动划分事务。在SQL语言中,定义事务的语句有三条:

    BEGINTRANSACTION;

    COMMIT;

    ROLLBACK

    事务通常是以BEGINTRANSACTION开始,以COMMIT或ROLLBACK结束。COMMIT的作用是提交,即提交事务的所有操作。事务提交是将事务中所有对数据的更新写回到磁盘上的物理数据库中去,事务正常结束。ROLLBACK的作用是回滚,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤消,回滚到事务开始时的状态。

    10.1.2 事务的特性

    事务具有4个特性,即原子性、一致性、隔离性和持续性。

    1.原子性(Atomicity):事务中包括的诸操作要么都做,要么都不做。也就是说,事务是作为一个整体单位被处理,不可以被分割。

    2.一致性(Consistency):事务执行的结果必须使数据库处于一个一致性状态。当数据库中只包含成功事务提交的结果时,就说数据库处于一致性状态。

    如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致状态,数据库系统必须确保事务的一致性。

    3.隔离性(1solation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

    4.持续性(Durability)。持续性也称永久性(Permanence)。持续性指一个事务一旦提交,它对数据库中数据的改变就是永久性的,接下来的其他操作或故障不应该对其执行结果有任何影响。

    事务的这些特性由数据库管理系统中并发控制机制和恢复机制保障。

    10.1.3 并发操作可能产生的问题

    这里以库存管理为例,说明对并发操作不加以限制,会产生数据不一致性问题,这种问题共有三类。

    1. 丢失更新

    假设某产品库存量为50,现在购入该产品100个,执行入库操作,库存量加100;用掉40个,执行出库操作,库存量减40。分别用T1和T2表示入库和出库操作任务。

    例如,同时发生入库(T1)和出库(T2)操作,这就形成并发操作。T1读取库存后,T2也读取了同一个库存;T1修改库存,回写更新后的值;T2修改库存,也回写更新后的值。此时库存为T2回写的值,T1对库存的更新丢失。如表10.1所示T1和T2的并发操作执行顺序,发生了“丢失更新”错误。

    表10.1 发生丢失更新的过程

    顺序

    任务

    操作

    库存量

    T1

    读库存量

    50

    T2

    读库存量

    50

    T1

    库存量=50+100

    T2

    库存量=50-40

    T1

    写库存量

    150

    T2

    写库存量

    10

    2. 读“脏数据”

    当T1和T2并发执行时,在T1对数据库更新的结果没有提交之前,T2使用了T1的结果,而在T2操作之后T1又回滚,这时引起的错误是T2读取了T1的“脏数据”。表10.2所示的执行过程就产生了这种错误。

    表10.2  T2使用T1的“脏数据”的过程

    顺序

    任务

    操作

    库存量

    T1

    读库存量

    50

    T1

    库存量=50+100

    T1

    写库存量

    150

    T2

    读库存量

    150

    T2

    库存量=150-40

    T1

    ROLLBACK

    50

    T2

    写库存量

    110

    3. 不可重复读

    当T1读取数据A后,T2执行了对A的更新,当T1 再次读取数据A(希望与第一次是相同的值)时,得到的数据与前一次不同,这时引起的错误称为“不可重复读”。表10.3所示的并发操作执行过程,发生了“不可重复读”错误。

    并发操作之所以产生错误,是因为任务执行期间相互干扰造成的。当将任务定义成事务,事务具有的特性(特别是隔离性)得以保证时,就会避免上述错误的发生。但是,如果只允许事务串行操作会降低系统的效率。所以,多数DBMS采用事务机制和封锁机制进行并发控制,既保证了数据的一致性,又保障了系统效率。

    表10.3  T1对数据A“不可重复读”的过程

    顺序

    任务

    操作

    库存量A

    入库量B

    T1

    读A=50

    50

    100

    2

    T1

    读B=100

    3

    T1

    求和=50+100

    T2

    读B=100

    50

    T2

    B←B×4

    T2

    回写B=400

    50

    400

    T1

    读A=50

    50

    8

    T1

    读B=400

    9

    T1

    和=450

    (验算不对)

    分析以上三种错误的原因,不难看出,上述三个操作序列违背了事务的四个特性。在产生并发操作时如何确保事务的特性不被破坏,避免上述错误的发生?这就是并发控制要解决的问题。

    展开全文
  • mysql并发控制

    千次阅读 2019-03-06 12:36:35
    因为可重复度保证了每一行的记录的一致性(也就是说事务处理的基本单位是“行”),所以当事务开始时,读取事务开始的行数据版本即可 小疑问: 为什么只有read-commited读取的是行数据的最新版本?为什么因为...

    在这里插入图片描述
    在这里插入图片描述解释: Read uncommitted(未提交读),就是说一个线程修改了某一个数据之后,还没有提交之前,就被其他线程读到修改后的数据,这样一来肯定会产生问题
    Read committed(提交读),(大多数数据库系统的默认隔离级别)就是说A线程修改了结果以后,必须提交之后才能被其他线程读到新结果,在他还没有提交之前,数据还是旧的数据。但是这样有一个纰漏,就是A线程在访问修改该数据的时候,其他线程也有可能随时读取到数据,这样的话,其他线程可能拿到的是旧数据,一旦A线程提交修改以后,其他线程那边的数据立刻刷新(valotile关键字的作用),所以还是可能会出现一些问题
    参考链接: https://blog.csdn.net/qq_40241957/article/details/83653379
    Repeatable read(可重复读):在这里插入图片描述
    Serializable(可串行化):由于它大量的加锁,所以性能低下,虽然可以避免很多数据读取问题。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    数据库的隔离级别详解参考链接:https://blog.csdn.net/qq_40241957/article/details/83653379
    解释:
    ①为什么read-uncommitted由于是读到未提交的,所以不存在版本的问题?
    答: 因为读未提交可以读到其他事务未提交的更新,每次拿去的都是最新的数据 ,所以版本号永远都是最新的
    ②为什么read-uncommitted隔离级别不能使用mvcc?
    答: 因为读未提交会读取到别人可能回滚的更新数据,所以数据不对,所以不建议使用mvcc
    ③为什么REPEATABLE READ则是读取事务开始时的行数据版本?
    答: 因为可重复度保证了每一行的记录的一致性(也就是说事务处理的基本单位是“行”),所以当事务开始时,读取事务开始的行数据版本即可
    小疑问: 为什么只有read-commited读取的是行数据的最新版本?为什么因为read-uncommited是读未提交的,所以不存在版本问题呢?上述图中最后一个括号里面的(注:事务A,事务B。。。。。。。)是什么意思呢?
    答: read-commited是通过“锁行”的方式来防止其他事务干扰

    在这里插入图片描述
    解释: 什么是意向锁概念?
    例如,当读取表里的页面时,在请求页共享锁(S锁)之前,事务在表级请求共享意向锁。这样可以防止其他事务随后在表上获取排他锁(X锁),修改整个表格。意向锁可以提高性能,因为数据库引擎仅在表级检查意向锁,确定事务是否能安全地获取该表上的锁,而不需要检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。(意向锁是更粗粒度的锁,相当于在最外层,其他事务访问数据之前最先检测到的就是意向锁
    在这里插入图片描述
    5.死锁的解决办法?
    产生死锁后需要由一个事务进行回滚,一般是选择回滚undo量最小的事务,一般是表锁引起死锁,因为其占用大量锁资源

    展开全文
  • 并发控制单位 ―― 事务     事务是数据库的逻辑工作单位,它是用户定义的一组操作序列。一个事务可以是一组 SQL 语句、一条 SQL 语句或整个程序。     事务的开始和结束都可以由用户...
  • 数据库题目之并发控制

    千次阅读 2019-01-11 09:45:17
    设有两个事务T1、T2,其并发操作如下所示,下面评价正确的是 。 A.该操作不存在问题 B.该操作丢失修改 C.该操作不能重复读 D.该操作读“脏”数据 【答案:】B T1 T2 ①读A=10 ...
  • <br />(1):事务(Transaction)是并发控制单位,是用户定义的一个操作序列。 这些操作要么都做,要么都不做,是一个不可分割的工作单位。 通过事务,SQL Server能将逻辑相关的一组操作绑定在一起...
  • 数据库并发控制

    千次阅读 2014-03-02 12:17:29
    1. 在数据库中为什么要并发控制?  答:数据库是共享资源,通常有许多个事务同时在运行。  当多个事务并发地存取数据库时就会产生同时读取和 /或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不...
  • 【数据库】并发控制

    千次阅读 2018-06-01 10:56:59
    以事务为单位管理用户程序的并发访问,提高资源共享效率。数据并发性意味着多个用户可以同时访问数据。 并发访问存在冲突吗?如何控制? 事务:用户定义的一个数据库操作序列.这些操作要么全做要么全不做,是一个不可...
  • 数据库并发控制详解

    千次阅读 2019-04-16 11:05:20
    1. 什么是并发控制? 数据库是一个共享资源,可以提供多个用户使用。这些用户程序可以一个一个地串行执行,每个时刻只有一个用户程序运行,执行对数据库的存取,其他用户程序必须等到这个用户程序结束以后方能对...
  • 数据库教研室 第13章 事务与并发控制 软件学院 教学安排 事务概述 事务的并发控制 封锁 1. 事务概述 事务(Transaction) 一组数据库操作的集合这些操作由一组相关的SQL语句组成事务是数据库系统中执行的一个独立工作...
  • java访问并发控制semaphore使用与总结

    千次阅读 2018-04-16 15:24:00
    semaphore 这个类是用作访问并发控制,可以设置资源最大同时访问的个数。 初始化时参数1 permits(许可数),定义资源可以并发访问的最大个数 例如 public static void main(String[] args) { ExecutorService...
  • 数据库的事务控制和并发控制

    千次阅读 2007-04-29 13:21:00
    事务控制 事务是并发控制的基本单位,也是恢复的基本单位。在SQL中支持事务的概念。所谓事务,是用户定义的一个操作序列(集合),这些操作要么都做,要么一个都 不做,是一个不可分割的整体。一个事务通常以BEGIN ...
  • 多种数据库的并发控制比较

    千次阅读 2007-03-06 20:20:00
    多种数据库的并发控制比较内容:比较的ORACLE INFORMIX DB2 SYBASE MSSQL等的并发控制机制。比较分析悲观与乐观并发控制机制的异同。引言:l 在关系数据库(DB2,Oracle,Sybase,Informix和SQL Server)最小的恢复...
  • 1.事务控制 事务是并发控制的基本单位,也是恢复的基本单位。在SQL中支持事务的概念。所谓事务,是用户定义的一个操作序列(集合),这些操作要么都做,要么一个都 不做,是一个不可分割的整体。一个事务通常以BEGIN ...
  • PostgreSQL 事务处理和并发控制

    千次阅读 2018-05-24 14:57:11
    事务处理和并发控制一、事务管理简介 事务是PostgreSQL中的基本工作单元,它是用户定义的一个数据库操作程序,这些操作要么全做、要么全部做,是一个不可分割的工作单位。1、事务含义2、事务的属性ACID四大属性:...
  • 数据库并发控制原理详解

    千次阅读 2013-11-28 20:59:47
    数据库并发控制原理 数据库属于公共资源库,当多个事务并发处理数据库数据时,如果控制不当则会造成数据的不一致性,出现数据混乱。对此,数据库引入了锁机制来解决这一问题。为了弄清这个问题,首先要明白为什么多...
  • 事务是并发控制的基本单位并发控制的目的:保证事务的隔离性和一致性 任务: 对并发操作进行正确调度 保证事务的隔离性 保证数据库一致性 并发操作带来的数据不一致性: 1、丢失修改:读入同一数据并修改 ...
  • 在分布式系统中,事务的运用和共享资源的并发控制是非常常见的。简单的说,事务就是一些原子的操作的集合。原子操作的意思就是要么操作成功要么操作失败,没有其他的选择。并发控制是出现在高并发场景的时候,本篇...
  • SQLServer-并发控制-锁机制

    千次阅读 2018-05-18 09:14:06
    并发可能导致的影响:1. 丢失更新:多个事务同时更新同一行;2. 脏读:修改过程中的数据被读取... 并发控制类型:1. 悲观并发控制:用到锁来保护数据。用于锁消耗低于回滚事务的成本环境中;2. 乐观并发控制:...
  • 数据库的并发控制和封锁协议分析

    千次阅读 2015-11-30 13:58:47
    目前主流的关系数据库通常都允许多个用户同时使用和共享,所以也都具有并发控制的机制,也就是控制数据库,防止多用户并发使用数据库时造成数据错误和程序运行错误,以保证数据的完整性。 二、事务与并发控制的概念...
  • 并发编程面试题(2020最新版)

    万次阅读 多人点赞 2020-03-14 17:28:01
    文章目录基础知识并发编程的优缺点为什么要使用并发编程(并发编程的优点)并发编程有什么缺点并发编程三要素是什么?在 Java 程序中怎么保证多线程的运行安全?并行和并发有什么区别?什么是多线程,多线程的优劣?...
  • 事务是并发控制的基本单位 并发控制的目的:保证事务的隔离性和一致性 并发操作带来的数据不一致性: 1. 丢失修改:读入同一数据并修改 2. 不可重复读:读第一次和读第二次的结果不一样,因为别人在中间修改...
  • 使用并发控制并发数据的实例

    千次阅读 2014-11-12 18:48:54
    大,队列在此起到特别的作用,将所有请求放入队列,以毫秒计时单位,有序的进行,从而不会出现数据丢失系统 数据不正确的情况。 加并发锁的原理:  就是给一些大批量业务对象在同时并发访问时,通过对
  • 事务处理与并发控制 PostgreSQL提供了多种数据完整性的保证机制,如约束、触发器、约束和锁管理等。 12.1 事务管理简介 事务是PostgreSQL中的基本工作单元,是用户定义的一个数据库操作序列,这些操作要么全做要么...
  • LINQ之开放式并发控制和事务

    千次阅读 2010-07-02 15:17:00
    Simultaneous Changes开放式并发控制介绍 LINQ to SQL 文档中涉及开放式并发的术语: 术语 说明 并发 两个或更多用户同时尝试更新同一数据库行的情形。 并发冲突 两个或更多用户同时尝试向一行的一列或多...
  • 1、事务概念:事务是包含了一组有序的数据库操作命令的序列,它是数据库并发操作的最小控制单位。 2、事务特性:原子性:事务包含的数据库操作命令要么都执行,要么都不执行。 一致性:当事务完成时,数据库处于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 147,599
精华内容 59,039
关键字:

并发控制的单位是表