数据库系统及应用(第5版)课件 第10章 事务管理与并发控制_第1页
数据库系统及应用(第5版)课件 第10章 事务管理与并发控制_第2页
数据库系统及应用(第5版)课件 第10章 事务管理与并发控制_第3页
数据库系统及应用(第5版)课件 第10章 事务管理与并发控制_第4页
数据库系统及应用(第5版)课件 第10章 事务管理与并发控制_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

事务管理与并发控制本章内容事务管理并发控制事务管理与并发控制事务管理123什么是事务事务的性质SQL对事务的支持事务的概念事务是构成单一逻辑工作单元的操作集合。买卖交易——一手交钱一手交货订票——

查询、订位、(交钱)、出票(往返票?)转帐——

转出、转入为什么需要事务恢复的需要并发操作的需要买卖交易——一手交钱一手交货订票——查询、订位、(交钱)、出票(往返票?)转帐——转出、转入例:需要将20000元从甲公司的账户转账到乙公司的账户读甲公司可转账金额到变量x如果x≥20000则有x=x–20000(甲公司余额减20000)

将x的值写回到数据库(更新甲公司账户余额)

读乙公司账户余额到变量yy=y+20000(乙公司余额加20000)

将y的值写回到数据库(更新乙公司账户余额)转账结束程序故障事务管理123什么是事务事务的性质SQL对事务的支持事务的性质

原子性(Atomicity)

一致性(Consistency)隔离性(Isolation)持久性(Durability)

事务的这些性质通常称为ACID特性原子性

事务的原子性强调了一个事务是一个逻辑工作单元,是一个整体,是不可分割的。一个事务所包含的操作要么全部做,要么全部不做。买卖交易——一手交钱一手交货订票——查询、订位、(交钱)、出票(往返票?)转帐——转出、转入一致性

一个事务执行一项数据库操作,事务将使数据库从一种一致性的状态变换成另一种一致性状态。

在事务执行前,总是假设数据库是一致的,那么当事务成功执行后,数据库肯定仍然是一致的。

买卖交易——一手交钱一手交货订票——查询、订位、(交钱)、出票(往返票?)转帐——转出、转入(帐目平衡)隔离性

如果每个事务单独执行能保持原子性和一致性,这些事务并发执行也能保持原子性和一致性,则是事务的隔离性。事务的隔离性由并发控制来保证。持久性

事务的持久性是指一旦事务成功完成,该事务对数据库所施加的所有更新都是永久的。在ATM取钱后银行系统突然发生故障?事务管理123什么是事务事务的性质SQL对事务的支持SQL对事务的支持

开始事务结束事务

事务保存点

开始事务

使用BEGINTRANSACTION命令显式说明一个事务开始,它说明了对数据库进行操作的一个单元的起始点。在事务完成之前出现任何操作错误和故障,都可以撤销事务,使事务回退到这个起始点。

结束事务

结束事务有两种情况,即成功或失败:成功结束事务的命令是COMMITTRANSACTION,它的作用是提交或确认事务已经完成,所以该命令也称作事务提交。

失败的事务需撤销,撤消事务的命令是ROLLBACKTRANSACTION,即撤消在该事务中对数据库所做的更新操作,使数据库回退到事务的起始点。

举例:如下程序的结果?BEGINTRANSACTIONCREATETABLETestTran(ColaINTPRIMARYKEY,ColbCHAR(3))INSERTINTOTestTranVALUES(1,'aaa')COMMITTRANSACTIONBEGINTRANSACTIONINSERTINTOTestTranVALUES(2,'bbb')ROLLBACKTRANSACTIONBEGINTRANSACTIONINSERTINTOTestTranVALUES(3,'ccc')COMMITTRANSACTION问题1:如上程序最终插入了哪几条记录?为什么?事务保存点

SQL标准还支持“事务保存点”技术,所谓事务保存点就是在事务的过程中插入若干标记,这样当发现事务中有操作错误时,可以不撤消整个事务,只撤消部分事务,即将事务回退到某个事务保存点。

事务保存点SQLServer支持事务保存点技术,设置保存点的命令是SAVETRANSACTION,具体格式是:

SAVETRANSACTIONsavepoint_name撤消部分事务或回退到事务保存点的命令也是ROLLBACKTRANSACTION,具体格式是:

ROLLBACKTRANSACTIONsavepoint_name假设有订票事务每个中间结点都可以当做一个保存点。北京西安成都兰州昆明银川呼市北京举例:如下程序执行的结果?BEGINTRANSACTIONCREATETABLETestTran(ColaINTPRIMARYKEY,ColbCHAR(3))INSERTINTOTestTranVALUES(1,'aaa')SAVETRANSACTIONtranspoint1INSERTINTOTestTranVALUES(2,'bbb')ROLLBACKTRANSACTIONtranspoint1INSERTINTOTestTranVALUES(3,'ccc')COMMITTRANSACTION问题2:如上程序最终插入了哪几条记录?为什么?注意:事务和程序是两个概念。一般来讲,一个程序中包含多个事务。一个事务可以是一条SQL语句、一组SQL语句或整个程序。并发控制————干扰问题并发控制123干扰问题可串行性封锁4死锁5活死锁6隔离级别并发控制123干扰问题可串行性封锁4死锁5活死锁6隔离级别案例:火车售票系统大家最熟悉的各种售票系统就是最典型的并发应用,以火车售票系统为例,很多时候都会出现很多人在同一时间查询购买同一天、同一车次、同一座席的车票,这种情况在春运期间尤甚,瞬间并发执行购票事务的人远不止成千上万。在不同的计算机和移动设备上运行的是同一个购票程序,通过输入日期、车次、座席,每个用户的购票行为就成为数据库上的一个事务,成千上万的事务在同时运行,很多人会在同一时间查询购买同一天、同一车次、同一座席的车票,如何保证一张车票不被多次卖出就是并发控制问题。并发事务中的不一致问题——干扰问题丢失更新问题

未提交依赖问题

不一致分析问题

幻象读问题

丢失更新问题举例(假设)

旅客A通过网络购票,要买一张9月15日北京到上海的G1次高速列车的一等座车票,旅客A在自己的终端上查到了剩余票信息(系统提示7车厢5D号可售)。几乎在同时,旅客B也通过网络购票,也要买一张和旅客A的要求完全相同的车票,并在自己的终端上查到了同样的剩余票信息(即7车厢5D号可售)。旅客A确认购买,并支付买了一张9月15日G1次7车厢5D号车票,旅客A的事务更新剩余票信息并将它存入数据库;

这时旅客B的事务如果不知道旅客A的事务已经购买了该车票,可能会使旅客B也买了一张完全相同的车票,旅客B的事务更新剩余票信息并将它存入(重复了旅客A的事务已经做过的更新)。

总的效果:9月15日G1次7车厢5D号车票卖了两次。其原因是:允许了旅客B的事务在过时的信息基础上去更新数据库,而没有迫使他去看最新的信息。丢失更新问题

用SQL术语描述丢失更新问题未提交依赖问题

未提交依赖问题也称为读“脏”(DirtyRead)数据问题,查询一个已经被其他事务更新、但尚未提交的元组,将会引起未提交依赖问题。

“脏”数据是指其它事务未提交的尚没有写回数据库中的数据。不一致分析问题

不一致分析问题也称为不可重复读问题很多应用可能需要校验功能,这时往往需要连续两次或多次读数据进行校验和分析,结果由于其他事务的干扰,使得前后结果不一致,从而产生校验错误(即不一致的分析)。

幻象读问题

幻象读问题与不一致分析问题有关,当事务A读数据时,事务B在对同一个关系进行插入或删除操作,这时事务A再读同一条件的元组时,会发现神秘地多出了一些元组或丢失了一些元组,把这种现象称作幻象读。

并发控制123干扰问题可串行性封锁4死锁5活死锁6隔离级别可串行性

可串行性通常看作是多个事务并发执行的正确性准则。如果多个事务并发执行和这些事务按某种顺序串行执行的效果是等价的,称作并发事务的可串行性或可串行化。可串行性的判断各单个事务如能将数据库从一个正确状态转变为另一个正确状态,则认为该事务是正确的;按任何一个串行顺序依次执行多个事务也是正确的(这里的串行顺序假定各个事务间彼此独立、不交叉);事务的交叉执行过程是正确的,当且仅当其与串行执行过程等价,则事务是可串行化的。

可串行性描述的是事务的隔离性。并发控制并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。并发控制的主要技术是封锁(Locking)。并发控制123干扰问题可串行性封锁4死锁5活死锁6隔离级别封锁的基本技术封锁的基本思想是,当需要查询或更新数据时,先对数据进行封锁,以避免来自其他事务的干扰,即隔离其他事务。针对不同的干扰问题可以有不同的封锁机制。

用SQL术语描述丢失更新问题封锁的基本思路实施封锁以后的时间序列封锁与事务吞吐量事务吞吐量:单位时间内可以完成的事务数量。封锁将降低事务吞吐量。如何在保证事务隔离性的前提下提高事务吞吐量?必要的封锁策略。根据不同的需要采取不同的封锁策略。封锁机制

共享封锁

独占封锁

更新封锁

共享封锁

共享封锁是为读操作设置的一种封锁,所以也称作读封锁,或简称S锁,目的是想读到一组不变的数据,也就是在读数据的过程中,不允许其他用户对该数据进行任何修改操作。

这种封锁可以保证最大的并发性,任何数量的用户都可以同时对同样的数据施加这种共享锁。已经实施共享锁的表拒绝来自其他事务的独占封锁和更新封锁。

独占封锁

独占封锁也叫排他封锁,它是为修改操作设置的一种封锁,也称为写封锁,或简称为X锁,这是最严格的一类封锁。当需要对表实施插入、删除或修改操作时,应该使用独占封锁。已经实施独占封锁的表,拒绝来自其他用户的任何封锁,但不拒绝一般的查询操作。

共享封锁和独占封锁是基本锁共享封锁和共享封锁是相容的;独占封锁与任何封锁均不相容。更新封锁

当需要对一个记录或一组记录进行更新时(只是修改,不包括插入和删除)使用更新封锁,该封锁的目的是防止其他用户在同一时刻修改同一记录。已经实施更新封锁的记录,拒绝来自其他用户的任何封锁,但不拒绝一般的查询操作。

锁的释放有些封锁在执行完相应操作后就自动释放封锁,有些封锁则保持到事务结束(提交或撤消)时才释放(无论如何,所有的封锁都会在事务结束时自动释放)。SQLServer中与封锁有关的命令

SQLServer的封锁操作是在相关语句的“WITH(<table_hint>)”子句中完成的,该短语可以在SELECT、INSERT、UPDATE和DELETE等语句中指定表级锁定的方式和范围。SQLServer中与封锁有关的命令常用的封锁关键词有:TABLOCK:对表施行共享封锁,在读完数据后立刻释放封锁,此类封锁可以避免读“脏”数据,但不具有可重复读的特性。

HOLDLOCK:与TABLOCK一起使用,可将共享锁保留到事务完成,而不是在读完数据后立即释放锁,这样可以保证数据的可重复独特性。NOLOCK:不进行封锁,此关键词仅应用于SELECT语句,这样可能会读取未提交事务的数据,即有可能发生“脏”读。TABLOCKX:对表实施独占封锁。UPDLOCK:对表中的指定元组实施更新封锁;这时其他事务可以对同一表中的其他元组也实施更新封锁,但是不允许对表实施共享封锁和独占封锁。体验封锁的效果1-1在第1个窗口执行事务ABEGINTRANSELECT*FROM仓储.仓库WITH(TABLOCKHOLDLOCK)在第2个窗口执行事务BBEGINTRANSELECT*FROM仓储.仓库WITH(TABLOCKHOLDLOCK)在第3个窗口执行事务CINSERTINTO仓储.仓库WITH(TABLOCKX)VALUES('WH40','深圳',999)

问题:第1个事务A加了共享锁,第2个事务B能否及时执行?为什么?第3个事务C能否及时执行?为什么?体验封锁的效果1-2问题:切换到第1个窗口结束事务A(如何结束?),然后再回到第3个窗口看INSERT命令是否执行?为什么?问题:再切换到第2个窗口结束事务B(如何结束?),然后再回到第3个窗口看INSERT命令是否执行?为什么?体验封锁的效果2-1在第1个窗口执行事务ABEGINTRANUPDATE仓储.仓库WITH(UPDLOCK)SET面积=888WHERE仓库号='WH2'在第2个窗口执行事务BBEGINTRANSELECT*FROM仓储.仓库WITH(TABLOCKHOLDLOCK)在第3个窗口执行事务CBEGINTRANSELECT*FROM仓储.仓库WITH(NOLOCK)问题:先执行第1个事务A,然后第2个事务B能否及时执行?为什么?第3个事务C能否及时执行?为什么?体验封锁的效果2-2切回到第1个窗口撤销事务(如何撤销?)问题:对比第2和第3个窗口查询到的仓库信息有什么不同?不同的原因是什么?并发控制123干扰问题可串行性封锁4死锁5活死锁6隔离级别产生死锁的原因右图示意了两个并发事务所发生事件的序列,假设程序A为了完成某个事务需要封锁仓库和职工两个关系,而几乎在同一时刻并发执行的程序B为完成另一个事务也需要封锁职工和仓库关系,这两个程序正好按照如图所示的交错序列执行命令,结果两个程序都为了等待对方释放数据资源而产生死锁。

两个事务互相永久等待发生死锁两个或多个事务等待被封锁资源形成环路时就会发生死锁。ABC如何避免死锁?避免死锁

相同顺序法

所有的用户程序约定都按相同的顺序来封锁表

一次封锁法

为了完成一个事务,一次性封锁所需要的全部表

避免死锁的封锁

发现死锁超时法

即一个事务在等待的时间超过了规定的时限后就认为发生了死锁。

这种方法非常不可靠,如果设置的等待时限长,则不能及时发现死锁;如果设置的等待时限短,则可能会将没有发生死锁的事务误判为死锁。

发现死锁等待图法

即通过有向图判定事务是否是可串行化的,如果是则说明没有发生死锁,否则说明发生了死锁。具体思路是:用节点来表示正在运行的事务,用有向边来表示事务之间的等待关系,如右图所示,如果有向图中发现回路,则说明发生了死锁。

解决死锁发现死锁后解决死锁的策略之一是:自动使“年轻”的事务(即完成工作量少的事务)先退回去,然后让“年老”的事务(即完成工作量多的事务)先执行,等“年老”的事务完成并释放封锁后,“年轻”的事务再重新执行。

并发控制123干扰问题可串行性封锁4死锁5活死锁6隔离级别“活死锁”没有发生死锁也有可能某个事务永远处于等待状态?“活死锁”T1:事务A共享封锁资源S,成功T2:事务B试图独占封锁资源S,等待T3:事务C在A释放封锁S之前,共享封锁S成功T4:事务D在C释放封锁S之前,共享封锁S成功……结果事务B无限期等待避免“活锁”?避免“活锁”按队列实施封锁T1:事务A共享封锁资源ST2:事务B试图独占封锁资源S,等待T3:事务C在A释放封锁S之前申请对S的共享封锁,由于事务B已经在等待S,所以事务C排队等待并发控制123干扰问题可串行性封锁4死锁5活死锁6隔离级别封锁与隔离级别封锁的目的是隔离事务,保证事务之间不互相干扰;不同的封锁机制和事务管理方式实际对应着不同的隔离级别。隔离级别可划分为:未提交读提交读可重复读可串行化未提交读(READUNCOMMITTED)事务隔离的最低级别,仅可保证不读取物理损坏的数据,甚至不介意读“脏”数据。对应封锁的NOLOCK,即读之前不加任何封锁。

提交读(READCOMMITTED)

默认级别,可以保证不读取“脏”数据。对应TABLOCK封锁,即读之前加共享封锁,读完之后即自动释放封锁。可重复读(REPEATABLEREAD)

可以保证读一致性,避免不一致分析问题。

对应TABLOCK+HOLDLOCK封锁,即读之前加共享封锁,并将封锁保持到事务结束。可串行化(SERIALIZABLE)

事务隔离的最高级别,事务之间完全隔离;如果事务在可串行化隔离级别上运行,则可以保证任何并发重叠事务均是串行的。根据情况对应TABLOCKX或UPDLOCK封锁,保证增、删、改操作不受其他事务干扰。

隔离级别与不同类型的行为根据操作的需要来设置隔离级别设置隔离级别的命令

SETTRANSACTIONISOLATIONLEVEL{READCOMMITTED|READUNCOMMITTED|REPEATABLEREAD|SERIALIZABLE}SETTRANSACTIONISOLATIONLEVELREADUNCOMMITTEDBEGINTRANSACTIONSELECT*FROM仓储.仓库封锁与隔离级别举例时间事务A事务Bt1BEGINTRANSACTIONSELECT*FROM仓储.仓库WITH(TABLOCKX)这条SELECT语句能否及时执行?为什么?SETTRANSACTIONISOLA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论