网络数据库讲稿(并发控制机制).doc_第1页
网络数据库讲稿(并发控制机制).doc_第2页
网络数据库讲稿(并发控制机制).doc_第3页
网络数据库讲稿(并发控制机制).doc_第4页
网络数据库讲稿(并发控制机制).doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

并发控制机制一、并发控制的概念SQL Server是多用户系统,即支持多个不同的程序或多个用户独立执行同一个程序同时存取数据库中相同的数据。SQL Server以事务为单位,可同时运行多个事务并行存取数据。多个事务交迭地执行,称为并发处理。并发处理可能会导致数据完整性与一致性方面的问题,如丢失更新、读出的是未提交的数据、非一致检索的问题等。为此,SQL Server必须对这种并发操作提供一定的控制以防止它们彼此干扰,从而保证数据库的正确性不被破坏,这种处理就是并发控制。通常使用锁来实现并发控制,协调并发操作以保证事务的隔离性,保持数据的一致性。二、并发异常问题当多个事务交错执行时,可能出现不一致性的问题,也称为并发控制问题,典型的并发处理产生的错误结果有如下三种。1. 丢失更新当两个事务T1和T2同时更新某条记录时,它们读取记录并修改,事务T2提交的结果破坏了T1提交的结果,导致T1的修改结果丢失。现以一个库存进出的实例进行分析。 假设当前某商品S1的在库数量是200,现在有两个并发事务T1和T2都将更新在库存中的数量, T1是采购入库事务,T2是卖出出库事务,即事务事务完成后的计算结果T1:入库400库存数量=库存数量+400T2:出库80库存数量=库存数量-80表1给出了在正常情况下这些事务的执行顺序和正确的结果,正确的最后执行结果应该是520。表1 两个事务正常执行的过程执行顺序事务步骤数据库中结果1T1读出库存数量2002T1库存数量=库存数量+4003T1将结果写回数据库6004T2读库存数量6005T2库存数量=库存数量-806T2将结果写回数据库520由于事务的处理是并发执行的,它们执行的过程流可能是交替的,如表2的执行过程,在这种执行顺序中会产生丢失更新时事务的执行顺序,表中当第二个事务T2执行时,T1还未提交。表2 发生数据丢失更新的过程执行顺序事务步骤数据库中结果1T1读出库存数量2002T2读出库存数量2003T1库存数量=库存数量+4004T2库存数量=库存数量-805T1将结果写回数据库600(将被丢失)6T2将结果写回数据库120在表2中,由于事务T1和T2是交替执行的,在将更新的结果写回数据库时,T1写入后马上由T2写入它所计算出的值,此时最后数据库中的结果是120,与表1中所得出的结果是完全不同的, 因此,如果对数据库更新时的并发事务不加以控制,将会出现大量的不可预期的错误结果。2读未提交数据当两个事务T1和T2并发执行时,在T1对数据库更新的结果没有提交之前,T2使用了T1的结果,如果在T2读取数据之后T1又撤消事务,就可能引起错误。读未提交数据产生的根源是违反了事务的隔离性。仍以上述实例来讨论。假定事务T1在增加了400个商品后,在没有提交之前撤消了这个操作,所以事务T2应该是从原来的库存数量200中减去80,正确结果应该是120。正确的操作顺序和结果如表3所示。表3 两个事务正常的执行顺序执行顺序事务步骤数据库中结果1T1读出库存数量2002T1库存数量=库存数量+4003T1将结果写回数据库6004T1*ROLLBACK*2005T2读出库存数量2006T2库存数量=库存数量-807T2将结果写回数据库120当T1和T2的交替执行步骤如表4时,T2使用了T1末提交的数据,从而产生了错误数据520。 我们把读出的这种未提交的数据称为废数据或者脏数据。表4 T2使用T1未提交数据后产生的错误执行顺序事务步骤数据库中结果1T1读出库存数量2002T1库存数量=库存数量+4003T1将结果写回数据库6004T2读出库存数量6005T2库存数量=库存数量-806T1*ROLLBACK*2007T2将结果写回数据库5203不可重复读取有时,一个事务可能对同一个数据连续读两次,然而事务的并发执行可能导致在两次读之间插入了另一个更新事务,这样会使前一个事务的两次读出的同一个数据值不一致,这就是不可重复读取问题。由于事务很可能读某些变化之前或变化之后的数据,就可能产生不一致的结果。例如:资金转帐过程中需要打印票据,系统中事务活动顺序如下:(1)事务T1打印A帐户转帐前的余额,设A=10万元。(2)事务T1从A帐户转出1万元,A=9万元。(3) 事务T2从B帐户转入A帐户2万元,A=11万元,T2提交。(4)事务T1打印A帐户转帐后的余额,A=11万元,T1提交。总之,一个数据库事务中可能包含多个输入输出操作,最终结果将使数据库从一个一致性的状态变成另一个一致性的状态,即在事务执行之前或之后数据库处于一致性的状态。然而,在事务的执行期问,数据库可能暂时处于一个不一致性的状态。若在数据库不一致性状态时读取数据,就有可能产生一些问题。解决这类问题的常用方法是对所修改的对象进行封锁,实现事务的隔离性。三、锁的概念锁就是事务对某个数据库中的资源(如表和记录)存取前,先向系统发出请求,封锁该资源。事务获得锁后,即获得对数据的控制权。事务释放它的锁之前,其它的事务不能更新此数据。当事务结束或撤消以后,释放被锁定的资源。四、锁的模式SQL Server有两种主要的锁模式:基本锁,专用锁。1. 基本锁基本锁的模式有两种:排它锁(Exclusive Locks),共享锁(Share Locks)。(1) 排它锁(X锁),也称“写锁”排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。使用排它锁能避免所有并发异常问题。(2)共享锁(S锁),也称“读锁”共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。*2. 专用锁专用锁的模式有四种:更新锁(U锁),意向锁,架构锁,大容量更新锁。五、锁的粒度SQL Server2000 具有多粒度锁定,允许一个事务锁定不同类型的资源。为了使锁定的成本减至最少,SQL Server 自动将资源锁定在适合任务的级别。锁定在较小的粒度(例如行)可以增加并发但需要较大的开销,因为如果锁定了许多行,则需要控制更多的锁。锁定在较大的粒度(例如表)就并发而言是相当昂贵的,因为锁定整个表限制了其它事务对表中任意部分进行访问,但要求的开销较低,因为需要维护的锁较少。SQL Server 可以锁定以下资源(按粒度增加的顺序列出)。资源描述RID行标识符。用于单独锁定表中的一行。键索引中的行锁。页8 千字节 (KB) 的数据页或索引页。扩展盘区相邻的八个数据页或索引页构成的一组。表包括所有数据和索引在内的整个表。数据库整个数据库。六、锁的使用1. 通过设置事务隔离级别使用锁隔离级别是一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。SQL Server 支持四种事务隔离级别:隔离级别读未提交数据丢失更新不可重复读取未提交读READ UNCOMMITTED是是是提交读READ COMMITTED否是是可重复读REPEATABLE READ否否否可串行读SERIALIZABLE否否否2. 设置表级锁当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁定提示。可以使用 SELECT、INSERT、UPDATE 和 DELETE 语句指定表级的锁定类型(在语句中使用WITH ()。例:SELECT 姓名,性别 FROM 学生 WITH (NOLOCK)一般来说,读操作需要共享锁,写操作需要排它锁。在语句中可使用的“锁定提示”如下表:锁定提示描述HOLDLOCK将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于 SERIALIZABLE。NOLOCK不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。PAGLOCK在通常使用单个表锁的地方采用页锁。READCOMMITTED用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。READPAST跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于 SELECT 语句。READUNCOMMITTED等同于 NOLOCK。REPEATABLEREAD用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。 ROWLOCK使用行级锁,而不使用粒度更粗的页级锁和表级锁。SERIALIZABLE用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。TABLOCK使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL Server 一直持有该锁。但是,如果同时指定 HOLDLOCK,那么在事务结束之前,锁将被一直持有。TABLOCKX使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。UPDLOCK读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。XLOCK使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用 PAGLOCK 或 TABLOCK 指定该锁,这种情况下排它锁适用于适当级别的粒度。*八、监视和管理锁1. 查看事务隔离级别设置事务隔离级后,使用DBCC USEROPTIONS语句查看当前的事务隔离级别。例:DBCC USEROPTIONSSET TRANSACTION ISOLATION LEVEL

温馨提示

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

最新文档

评论

0/150

提交评论