[哲学]数据库原理课件 第四章 数据库事务.doc

上传人:sccc 文档编号:4665248 上传时间:2023-05-05 格式:DOC 页数:59 大小:2.39MB
返回 下载 相关 举报
[哲学]数据库原理课件 第四章 数据库事务.doc_第1页
第1页 / 共59页
[哲学]数据库原理课件 第四章 数据库事务.doc_第2页
第2页 / 共59页
[哲学]数据库原理课件 第四章 数据库事务.doc_第3页
第3页 / 共59页
[哲学]数据库原理课件 第四章 数据库事务.doc_第4页
第4页 / 共59页
[哲学]数据库原理课件 第四章 数据库事务.doc_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《[哲学]数据库原理课件 第四章 数据库事务.doc》由会员分享,可在线阅读,更多相关《[哲学]数据库原理课件 第四章 数据库事务.doc(59页珍藏版)》请在三一办公上搜索。

1、第四章 数据库事务SQL Server 20002005数据库系统通过事务保证多个数据库操作在一起处理,而事务使用锁定技术来防止其他数据库用户来更新或读取末完成事务中的数据。同时,SQL Server数据库系统为了提高自身的性能,实现多用户之间数据的共享,采用并发控制策略来实现多个任务的并行运行。4.1 SQL Server中事务的定义1实验目的 熟悉SQL Server的事务控制语言,能够熟练使用事务控制语言来编写事务处理程序。2原理分析(1) 事务的概念事务(transaction)是一组单一逻辑工作单元的操作集合,是用户采用高级数据操纵语言或编程语言书写的用户程序,并由事务开始begin

2、 transaction和事务结束end transaction来界定全体操作的集合。(2) 事务的性质数据库管理系统为了实现数据库系统的完整性,事务的ACID性质是数据库事务处理的基础,它要求事务具有以下的性质:原子性(atomicity):要求事务的全部操作要么在数据库中全部正确的反映出来要么全部不反映。一致性(consistency): 数据库中数据不因事务的执行而受到破坏,事务执行的结果应当使得数据库由一种一致性达到另一种新的一致性。数据的一致性保证数据库的完整性。隔离性(isolation): 事务的并发执行与这些事务单独执行的结果一样。也就是说,在多个事务并发执行时,各个事务不必关

3、心其它事务的执行,如同在单个用户环境下执行一样。事务的隔离性是事务并发控制技术的基础。持久性(durability):事务对数据库的更新应永久地反映在数据库中。也就是说,一个事务一旦完成其全部操作之后,它对数据库所有更新操作的结果将在数据库中永久存在,即使以后发生故障也应保留这个事务的执行结果。持久性的意义在于保证数据库具有可恢复性。(3) 事务的控制 事务的操作可由事务开始、事务读写、事务提交、事务回滚若干个基本操作组成,SQL Server提供事务控制语法,来将SQL Server语句集合分组后形成单个的逻辑工作单元,每个单元都是一个独立的事务。表4.1.1 事务控制语句语法及含义事务控制

4、语句语法事务控制语句的含义BEGIN TRAN表示事务开始执行COMMIT TRAN表示事务完成所有数据操作,同时保存操作结果,它标志着事务的成功完成ROLLBACK TRAN表示事务未完成所有数据操作,重新返回到事务开始,它标志着事务的撤销SAVE TRAN表示完成部分事务,同时撤消事务的其他部分在事务控制中常常还需要通过检测两个全局变量:ERROR,TRANCOUNT来检测事务的状态。全局变量ERROR记录任何Transact SQL语句中的最近错误。如果语句成功执行,变量值为0;如果语句执行失败,变量值不为0。在事务定义处理时,往往需要检查ERROR来判断语句执行是否成功。如果没有成功,

5、则需要使用ROLLBACK TRAN语句来撤消事务。全局变量TRANCOUNT记录SQL Server当前等待提交的事务数,如果没有等待提交的事务数,全局变量TRANCOUNT的值为0。(4) 事务的类型对数据库的访问是建立在对数据“读”和“写”两个操作之上的,因此,一般事务中涉及到数据操作主要是由“读”与“写”语句组成,而当事务仅由读语句组成时,事务的最终提交就会变得十分简单。因此,有时可以将事务分成只读型和读写型两种。只读型(Read Only)此时,事务对数据库的操作只能是读语句,这种操作将数据X由数据库中取出读到内存的缓冲区中。定义此类型即表示随后的事务均是只读型,直到新的类型定义出现

6、为止。读写型(Read/Write)此时,事务对数据库可以做读与写的操作,定义此类型后,表示随后的事务均为读/写型,直到新的类型定义出现为止。此类操作可以缺省。上述两种类型可以用下面的SQL语句定义:SET TRANSACTION READ ONLYSET TRANSACTION READ WRITE3实验内容事务编程是数据库应用系统中经常要用到的技术,通过使用事务控制语言和SQL语句实现各种事务操作。4实验步骤假设对于某数据库用户在银行有两个帐号,分别为帐号和帐号,现在需要从帐号转1000元到帐号,编写事务处理程序,实现这一操作。假设学校将学生的银行卡和校园卡进行了绑定,允许学生直接从银行卡

7、转账到校园卡中。假设某学号为05212222的学生需要从银行卡中转账100元到校园卡中,编写事务处理程序,实现这一操作。已将该例子进行更新将此处增加的表结构增加到school数据库中,请编写创建结构和初始数据的代码zheng.hx回复:此处的表结构及数据在原先数据库已经存在要求:(1) 采用隐式事务方式来实现事务编程。(2) 采用显示显式用户定义事务的方式来实现事务编程。(3) 事务与批命令。(4) 嵌套事务的编程。(5 ) 在存储过程、触发器中使用事务编程。(6) 命名事务与事务保存点。分析与解答:(1) AutoCommit事务是SQL Server默认事务方式。它指出每条SQL语句都构成

8、事务,隐含事务的开始与结束控制点。见示例代码4.1.1示例代码4.1.1实现从银行卡中转账100元到校园卡的功能。如果在执行语句时遇到错误,则撤消操作,否则提交并保存操作的结果。代码4.1.1思考一下,这样的事务编程是否会造成数据库状态的不一致呢?由于上面的代码中采取的隐式事务方法,如果对该学生的帐户A银行卡数据更新成功,由会自动向数据库提交。假若后来对帐户B该学生校园卡的数据的更新末能成功,则就造成转帐失败,但前一操作已经提交,无法还原。这就可能会造成对数据库状态与事实语义不一致。针对这一问题,需要设法将这若干条SQL语句组合成一个独立的事务,这样才能保证各个操作步骤要么同时成功,要么一起失

9、败。这就需要操作步骤2中所提出的定义显式事务方式来处理事务。 (2) 为了完全控制事务并定义多个操作步骤组成的逻辑工作单元,可以采用显示显式用户定义事务的方式来实现用户期望的逻辑操作,见代码4.1.2。 代码4.1.2 (3) 批处理是由一条或多条Transact SQL语句或命令组成的,它能够成组的运行,用于向SQL Server提交成组的Transact SQL的语句组,由Go语句来终止语句组。批处理经过整体编译一次成为一个执行计划,并一次将整个执行计划执行完毕。注意除非批命令没有固有的事务性质量,除显示显式的定义由几个语句构成的单个事务,否则批命令中的每条语句都是一个互相独立的事务,每条

10、语句单独完成或者失败,而且批命令中的一个事务失败,不会影响其他语句的执行。利用查询分析器中执行代码4.1.3:在查询分析器中输入代码4.1.3: Update courses set hour=96 where cid=10001 Insert teachers values(1234567890,MY,MYZSU.EDU.CN,3000) Select top 10 * from teachers (HoldLock) Go代码4.1.3打开SQL Server Profiler,新建跟踪,使用standard标准模板。此时SQL Server Profiler中会把SQL Server中的

11、事件记录下来。执行代码4.1.3,结果如4.11所示。显示SQL BatchStarting和SQL BatchCompleted语句都分别只有一条,说明批处理是一个完整的执行计划,并且要将整个执行计划执行完毕。并打开事件探查器以标准的SQLProfilerStandard模板来记录SQLServer所发生的事件,得到图4.1.1的结果,显示只有一条SQL BatchCompleted语句,说明批处理是一个完整的执行计划,并且要将整个执行计划执行完毕。图4.1.1 批处理操作跟踪相反,如果没有GO语句,读者也可以通过事件探查器来观察一下,结果是每个语句单独执行。不成立。没有Go也会得到一样的结

12、果。除非每次选择一条语句执行,执行三次,才会出现不同的结果。是吗?有待验证! (4) 嵌套事务主要是为了支持存储过程中的一些事务,这些事务可以从事务中已有的进程中调用,也可以从没有活动的事务进程中调用。嵌套事务对于COMMIT TRANSACTION语句的每个调用都对应于最后执行的BEGIN TRANSACTION语句,也就是最内层的事务。读者执行事务嵌套的实例代码4.1.4,执行结果如图4.1.2。 。SELECT BEFORE TRANSACTION: AS HINT,TRANCOUNT AS TRANACTIONCOUNTBEGIN TRANSELECT THE FIRST TRANSA

13、CTION STARTS: AS HINT,TRANCOUNT AS TRANACTIONCOUNT SELECT TOP 3 * FROM CHOICES BEGIN TRAN SELECT THE SECOND TRANSACTION STARTS: AS HINT,TRANCOUNT AS TRANACTIONCOUNT COMMIT TRAN SELECT THE SECOND TRANSACTION COMMITS AS HINT,TRANCOUNT AS TRANACTIONCOUNTROLLBACK TRAN SELECT THE FIRST TRANSACTION ROLL B

14、ACK AS HINT,TRANCOUNT AS TRANACTIONCOUNT代码4.1.4图4.1.2(5) 触发器是一种特殊类型的存储过程,主要用于完成数据库中对象的完整性。在表中进行数据修改时自动执行,触发器被视为执行数据修改事务的一部分,与数据修改语句在同一事务空间中执行。由于触发器已经在事务情境中操作,因此事务中要的事务控制语句只有ROLLBACK或者SAVE TRAN,用户不需要发出BEGIN TRAN。代码4.1.5为Courses的删除操作创建一个触发器,然后执行一个删除操作,观察事务数目的变化。在删除操作执行的过程中,触发器得到执行,而且事务的数目为1,这就验证了触发器事务

15、是数据修改事务的一部分。CREATE TRIGGER TD_COURSE ON COURSES FOR DELETEAS DECLARE INFO VARCHAR(255) SELECT INFO=触发器中的事务数据为:+CONVERT(VARCHAR(2),TRANCOUNT) PRINT INFORETURN代码4.1.5执行以下代码:PRINT 删除操作以前触发器中的事务数为: + CONVERT(VARCHAR(2),TRANCOUNT);DELETE FROM COURSESWHERE CID=10052PRINT 删除操作之后触发器中的事务数为: + CONVERT(VARCHAR

16、(2),TRANCOUNT);所得结果图4.1.3所示。图4.1.3 同样可以从事务中调用存储过程,也可以在存储过程中启动事务,而且这是经常在数据库开发过程中应用到的,因为在存储过程中使用事务,可以提高数据库操作的效率,可以方便维护。在企业管理器中创建存储过程图4.1.4示。CREATE PROCEDURE INSERTCOURSEINFOcourseid char(10),coursename varchar(30),hour int,returnString varchar(100)ASBEGIN TRANIF EXISTS(SELECT CID FROM COURSES WHERE CI

17、D=COURSEID)BEGINSELECT returnString=课程信息已经存在GOTO ONERROREND-新增课程信息INSERT INTO COURSES VALUES(courseid,courseName,hour)IF ERROR0BEGINSELECT returnString=新增课程信息失败GOTO ONERRORENDSELECT returnString=新增课程信息成功COMMIT TRAN-错误处理ONERROR:ROLLBACK TRAN图4.1.4 在存储过程中使用事务进行数据库的操作(6) 命名事务与保存点事务在编写大的存储过程、长的批处理、以及大量事

18、务嵌套的时候,一个常见的问题就是代码的可读性差。为了改进代码的可读性,在进行事务编程的时候,可以对事务进行命名来清晰的标识事务,来提示用户代码的逻辑性。命名事务是通过在BEGIN TRAN语句中为事务命名,来标志整个事务逻辑的工作单元。通过对事务命名,使得每个事务都易于识别,这对于事务嵌套更加重要。下面定义两个事务,内层事务更新表Courses,外层事务用于更新表Choices,通过事务命名的方法来增加对事务的可读性,参见代码4.1.6。代码4.1.6 事务嵌套中使用事务命名来提高程序可读性给事务命名的另一种方法是事务保存点,事务保存点提供一种在事务中标记用ROLLBACK撤消事务工作点的方法

19、。利用事务保存点,可提交事务开始处至保存点的部分事务,而将事务的其他部分撤消。请读者执行代码4.1.7。代码4.1.7 在事务中使用保存点来保存部分事务的操作结果5自我实践(1) 编写事务处理程序在School数据库的Courses表中分别插入记录。(2) 编写事务处理程序在School数据库中更新Courses表中的指定记录。(3) 编写事务处理程序在School数据库中删除Courses表中的指定记录。(4) 在查询分析器中或者客户程序中调用存储过程。参考答案:分别参见代码:4.1.8,4.1.9,4.1.10练习4的代码见源代码文件夹中的应用示例文件夹。应用程序的源代码是采用Delphi

20、实现。 4.2 SQL Server 20002005事务与锁对4.2和4.3进行了结构上的整理。把原4.3中“2)”和“3)”的内容放到4.2中;把原4.2中原理解析中的内容作为一个知识点放到4.3中同时对实验内容部分做了相应的调整主要考虑到:(1) 调整后4.2节中的内容基本围绕“锁”这个概念展开(2) 调整后4.3节中的内容基本围绕并发中出现的问题,以及通过隔离级别解决这些问题来展开可以!是否用一两句话来说明系统本身可以上锁(第一点),也可以用户自定义的锁(第二点),(索引第三点)分开介绍一下,主要是逻辑上让读者清晰一点1实验目的前面提到,在SQL Server 20002005这个多用

21、户数据库中,为了实现多个用户的同时存取,需要对数据库进行锁定。实验将帮助读者深入了解事务执行过程中,SQL Server数据库是如何实现对数据行、索引页等资源,一次只让一个用户使用的。2原理分析封锁是指任何事务T在对某数据操作之前,先向系统发出请求对其加锁。加锁后事务T就对该数据拥有了一定的控制权,在事务T释放锁之前其它事务不能更新该数据,通过这种手段保证数据库数据的完整性。这一段原本是4.2节原理解析最后一段1)系统默认锁定策略待完成事务的并发执行是数据共享性的重要保证,但并发执行应当加以适当控制,否则就会出现数据不一致现象,破坏数据库的完整性,可能会产生以下问题:(1) 丢失修改丢失修改(

22、Lost Update)是指两个事务T1和T2从数据库读取同一数据并进行修改,其中事务T2提交的修改结果破坏了事务T1提交的修改结果,导致了事务T1的修改被丢失。丢失修改是由于两个事务对同一数据并发地进行写入操作所引起的,因而称为写-写冲突(Write-Write Conflict)。(2) 读“脏数据”读“脏”数据(Dirty Read)是指事务T1将数据a修改成数据b,然后将其写入磁盘;此后事务T2读取该修改后的数据,即数据b;接下来T1因故被撤销,使得数据b恢复到了原值a。这时,T2得到的数据就与数据库内的数据不一致。这种不一致或者不存在的数据通常就称为“脏”数据。读“脏”数据是由于一个

23、事务读取的另一个事务尚未提交的数据所引起的,因而称之为读-写冲突(Read-Write Conflict)。(3) 不可重复读取不可重复读(Non-repeatable Read)是指当事务T1读取数据a后,事务T2进行读取并进行更新操作,使得T1再读取a进行校验时,发现前后两次读取值发生了变化,从而无法再读取前一次读取的结果。不可重复读也是由读写冲突引起的。 为了保证数据库中事务并发执行的正确性,其根本原则就是实现事务并发执行的“可串行化准则”,可串行化是对并发事务调度的一种评价手段,实际应用中还必须寻求一种灵活、有效和可操作的封锁等技术手段保证调度的可串行化。封锁是指任何事务T在对某数据操

24、作之前,先向系统发出请求对其加锁。加锁后事务T就对该数据拥有了一定的控制权,在事务T释放锁之前其它事务不能更新该数据,通过这种手段保证数据库数据的完整性。2) 利用锁定提示来控制锁定策略与此同时,系统中可能也有其他的事务并不需要高的隔离级别,有关的表述需要做进一步的修改这时,可以使用锁定提示语句,将事务语句的隔离级别的影响范围针对所配置的SQL的语法,采用在查询语句加锁的方式来保证事务并发控制的正确性,又不至于降低系统的效率。通过SQL Server的封锁操作是在相关语句的“WITH (table_hint)子句中完成的,可用在SELECT、INSERT、UPDATE、DELETE等语句中指定

25、表级锁定的方式和范围。常用的封锁关键词有:(1)TABLOCK:对表施加共享锁,在读完数据后立即释放封锁,它可以避免读“脏”数据,但可能引起不可重复读问题。(2) HOLDLOCK:与TABLOCK一起使用,可将共享锁保留到事务完成,而不是在读完数据后立即释放,它可以保证数据的可重复读。(3)NOLOCK:不施加任何封锁,仅用于SELECT语句,它会引起读“脏”数据。(4)TABLOCKX:对表施加排它锁。(5)UPDLOCK:对表中指定元组施加更新锁,这时其他事务可对同表中的其他元组也施加更新锁,但不能对表施加任何锁。如对课程表施加共享锁,并且保持到事务结束时再释放封锁:SELECT * F

26、ROM COURSE WITH (TABLOCK HOLDLOCK)可以使用的锁的类型主要有:NOLOCK可以使用 SELECT、INSERT、UPDATE 和 DELETE 语句指定表级锁定提示的范围,以引导 Microsoft SQL Server 2005 使用所需的锁类型。当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁定提示。这些锁定提示取代了会话的当前事务隔离级别。数据库作为共享资源,允许多个用户程序并行地存取数据。当多个用户并行地操作数据库时,需要通过并发控制对它们加以协调、控制,以保证并发操作的正确执行,并保证数据库的一致性。 在SQL中,并发控制采用封锁技术实现,当一

27、个事务欲对某个数据对象操作时,可申请对该对象加锁,取得对数据对象的一定控制,以限制其他事务对该对象的操作。其语句格式为: |SHARE| LOCKTABLE表名(或表名集合)IN|EXCLUSVE|MODENOWAIT |SHAREUPDATE| 书上是写成这样的:LOCKTABLE表名(或表名集合) INSHARE (或SHAREUPDATE | EXCLUSVE) MODENOWAIT其中,表名(或表名集合)中指出封锁对象,若为多个表名,则各个表名间以“,”相隔;任选项NOWAIT表示多个用户要求封锁相同的关系时,后来提出的要求会被立即退回去,否则会等待该资源释放。 值得注意,控制SQL

28、Server的锁既可以通过设置隔离级别来改变特定连接持有共享锁或排他锁的时间长短,也可以利用锁定提示对连接的锁定策略加以调节,不过锁定提示只对一个查询中的一个表起作用。 3) 给表的索引实行锁控制利用索引为单位也可以控制锁,与隔离级别和锁定提示不同的是,索引是从表的角度来控制锁,而隔离级别和锁定提示是从连接与查询的角度来控制锁的。用户首先可以通过执行sp_help tablename找出主键索引的名字,然后利用sp_indexoption系统存储过程来设置索引选项。其语法格式为:EXEC sp_indexoption 索引名3实验内容对该小节的实验内容部分做了相应调整:将原4.3实验内容中(2

29、)和(3)放到该部分,以对应原理分析中的内容在SQL Server的事务与锁的实验部分,读者验证单个事务执行过程中锁的获得与释放的过程,并加深对锁类型与锁定资源的认识与理解。通过实验验证多个事务并发执行过程中,可能产生的数据不一致现象。(1) 编写事务程序,用于更新courses表中database课程的信息,观察其事务过程中锁的获得与释放的情况,以及锁定资源的类型。分析通过锁定查看的结果,结合实际分析。 (2) 模拟一个火车站的售票事务处理,通过语句提示锁定方式来提高系统的效率。(3) 在索引级别粒度上实现对数据库对象的加锁或者解锁。4实验步骤(1) (1) 编写事务程序,用于更新cours

30、es表中database课程的信息,观察其事务过程中锁的获得与释放的情况,以及锁定资源的类型。(2) 分析通过锁定查看的结果,结合实际分析。分析与解答:SQL Server数据库管理系统通过组件SQL Server Lock Manager来提供用户事务进程之间的锁的自动分配,保证数据库资源(数据页、索引页、表、索引、数据库)的当前用户的特定操作从开头到结束都拥有这些资源的一致视图,从而保证事务的一致性。锁管理器(Lock Manager)会根据不同的事务类型分配适当锁类型(如共享、排他、更新等)和锁粒度(行、页、表等),并且保证访问资源的锁类型之间的相容性,防止和消除死锁,并将锁自动调整。可

31、以通过SQL Server数据库管理系统的提供的工具,来监视和跟踪SQL Server中的锁活动信息。常见的方法有: 使用sp_lock存储过程 使用企业管理器查看锁信息 使用SQL Server ProfilerSQL Profile查看锁信息(1) 使用sp_lock存储过程 通过查询分析器打开一创建一个数据库连接很多学生不明白如何新建数据库联接,这里可以在此增加一个注释,说明这些图形工具(包括)其实都是DBMS数据引擎的客户端,怎样就是打开对数据库的连接,。在“文件”菜单中选择“新建”,选定“数据库引擎查询语言”。在新窗口中选择相应的服务器和身份验证方式,点击“连接”按钮即可创建一个新连

32、接。或者点击工具栏上的图标也可以创建一个数据库连接。以前我都是点击来新建一个窗口的,但现在发现这种方法创建的是同一个连接上的查询,但好像仍可以实现并发的功能(只需在两个查询中编写相应的代码即可),不知道我原来这种做法对不对?其实我们可以认为sql server是基于一个客户服务的架构,DBMS是服务器,而我们所有的工具(包括企业管理器)都是客户端,如何新建一个连接呢?我也没有标准答案,我原来的理解是一个数据库用户的链接就是一个链接,你的方法在我原来的观点来看认为是同一个链接,但为什么又可以实现并发呢?我重新思考链接的概念,是不是和DBMS的一次会话就是一次连接呢?我也不知道。你去查资料看看核实

33、看看zheng.hx回复:事实上,我觉得并发应该可以分为单用户并发(自创词汇?)和多用户并发。单用户并发就是通过同时实现多个查询来实现的。 在新建的数据库连接中编写更新courses表中的database课程信息。注意事务没有提交语句,这主要是便于观察更新表的过程中锁资源的分配情况。 更新事务语句(注:为了便于观察锁的信息,事务没有提交或回滚)如下: begin tran update courses set hour=80 where cid=10001 通过查询分析器打开另一个数据库连接,执行Exec sp_lockGo返回SQL Server中所有进程的信息,其输出样本如下: 图4.2.

34、1 用sp_lock查看SQL Server进程中的锁信息 sp_lock spid如果要查看指定进程的spid,则仅仅显示与spid相关的锁。执行以下语句:exec sp_lock 53结果如下图所示。 图4.2.2 用sp_lock查看SQL Server指定进程的锁信息这就是更新事务执行过程中,获得锁的信息。其中:Sspid是更新请求锁的进程的数据库引擎会话 ID 事务的进程ID。Ddbid是保留锁的数据库的ID。持有锁的数据库ID。ObjId是持有锁的对象ID。ObjidIndId是持有锁的表索引ID,。0表示数据行、数据页、表或数据库的锁;1表示聚簇索引数据行、索引行或索引页的锁。2

35、-254表示非聚簇索引行或页的锁;255表示text或image 页的锁。Type是资源持有锁的锁粒度类型,表明SQL Server 加锁的资源对象的粒度。封锁的封锁粒度(Granularity)是指实行事务封锁的数据目标的大小。在关系数据库中封锁粒度一般有如下几种。属性(值)。属性(值)集合。元组。关系表。物理页面。索引。关系数据库。从上面7种不同粒度中可以看出,事务封锁粒度有大有小。一般而言,封锁粒度小则并发性高但开销大,封锁粒度大则并发性低但开销小。综合平衡不同需求、合理选取封锁粒度是非常重要的。如果在一个系统中能同时存在不同大小的封锁粒度对象供不同事务选择使用,应当说是比较理想的。一般

36、来说,一个只处理少量元组的事务,以元组作为封锁粒度比较合适;一个处理大量元组的事务,则以关系作为封锁粒度较为合理;而一个需要处理多个关系的事务,则应以数据库作为封锁粒度最佳,表4.2.1详细说明锁定资源的粒度:表4.2.1微软的帮助文档中给出11种锁类型,应该选取哪个版本?见资源描述RID数据行标识符。用于单独锁定表中的一行。Key索引中的行锁。用于保护可串行事务中的键范围。Pag8 千字节 (KB) 的数据页或索引页。Ext 相邻的八个数据页或索引页构成的一组。IDX索引存在此项吗? 你查查,如果没有就去掉,看看2005对应的内容是什么?TAB包括所有数据和索引在内的整个表。DB数据库。Re

37、source是持有锁的资源对象的内部名称,读者可以在master数据库的syslockinfo表中找到。SQL2005中已经没有这个master数据库了,应该重新探讨 好的Mode是事务请求的锁的类型。SQL Server的锁定类型表4.2.2 所示。表4.2.2类型描述S共享锁定E独占锁定IS意图共享锁IX意图独占锁SIX共享意图独占锁Sch-S结构稳定锁Sch-M结构修改锁U更新锁定BU批量更新锁定X排它锁Status:锁定请求状态。GRANT表示提供锁定;WAIT表示锁定被另一进程保持的锁定阻止;CNVT表示锁定要改变模式。(2) 用SQL Enterprise Manager浏览锁活动

38、使用sp_lock查看锁活动信息时,显示的是数据库对象的ID值。在SQL Enterprise ManagerSQL Server Management Studio中提供了系统与用户对象锁进程的直观显示。读者通过展开管理文件夹,展开当前活动项目双击打开活动监视器,并单击或者,就可以显示查看SQL Server中的锁信息。在左侧选择页中选择可以在右窗口中显示SQL Server中按照进程分类的锁信息。在上方的下拉框中指定要查看的进程,可以列出该进程当前所持有的锁。如图4.2.3所示。图4.2.3 SQL Enterprise Manager浏览锁活动单击可以在右窗口中显示SQL Server中

39、当前持有锁的进程的快照。单击其中任何一个进程,可以列出进程当前所持有的锁,如图4.2.3所示。图4.2.3 SQL Enterprise Manager浏览锁活在左侧选择页中选择可以在右窗口中显示SQL Server中按照对象分类的锁信息。在上方的下拉框中指定要查看的对象,可以列出该对象当前持有的所。如图4.2.4所示。图4.2.4 SQL Enterprise Manager查看数据库对象当前持有的锁动单击可以在右窗口中显示SQL Server中当前持有锁的对象快照,单击一个对象可以列出这个对象当前持有的锁,如图4.2.4示。 图4.2.4 SQL Enterprise Manager查看数

40、据库对象当前持有的锁(3) 用事件探查器SQL Server Profiler浏览锁活动SQL Server Profiler事件探查器专门用于捕捉数据库中一些重要的事件,对于锁活动,SQL Server Profiler事件探查器也提供了一些锁事件,用于在跟踪中捕获。表4.2.3事件意义DeadLock graph发生死锁时生成XML说明新增的Lock:Acquired表示何时取得数据页或行等资源的锁Lock:Cancel表示何时取消所取得资源的锁Lock:DeadLock表示两个或多个并发进程何时形成相互死锁Lock:Escalation表示低级锁何时升级为高级锁Lock:Release表

41、示进程释放以前所取得的锁资源Lock:Timeout选择资源锁请求超时SQL Server ProfilerSQL Profiler还能提供对监视事件显示的数据值,如表4.2.4。表4.2.4数据项意义spid产生事件的进程的进程IDEventClass捕获的事件类型Mode捕获事件中涉及到的锁类型ObjectID锁事件中涉及的对象IDObjectName锁事件中涉及的对象名IndexID锁的相关索引IDTextData产生锁事件的查询LoginName与进程相关联的登录名ApplicationName产生锁事件的应用程序名同样,针对于实验一中的操作,利用事件探查器来观察锁事件。首先建立需要跟

42、踪事件的模板,通过在跟踪属性模板中的“事件”页面,选择锁类型事件;在“数据列”中,选择需要关注的数据项名;然后保存为新的锁事件跟踪模板。如图4.2.5所示。同样,针对于实验一种的操作,利用SQL Server Profiler来观察锁事件。首先新建跟踪,弹出跟踪属性窗口,在“常规”页中选择需要跟踪事件的模板,在“事件选择”页中选择“显示所有事件”;在“事件列”中打开“Locks”事件,选择需要关注的事件;然后点击“运行”。如图4.2.5所示。图4.2.5 事件探查器设置待观察的锁事件其次,通过新建“跟踪“,在另一个连接中执行更新事务。在SQL Server的事件探查器中,可以看到事务执行过程中

43、锁事件的变化,如图4.2.6示。图4.2.6 事件探查器观察的锁事件(2) 火车订票系统采取更新锁最为合适。假设售票信息存放在表R(日期,班次,座号,状态)中,其中状态表明机票是滞售出,初值为NULL。程序段为: DECLARE d datetime,t char(6),n char(10),s char(2) /输入d , t ,nBEGIN TRANSACTIONSELECT n=座号 FROM R WITH(UPDLOCK) WHERE 日期=d AND 班次=t AND 状态 IS NULL IF UPDATE R SET 状态=Y WHERE 座号=n AND日期=d AND 班次

44、COMMIT TRANSACTION ELSE ROLLBACK TRANSACTION(3) 利用索引进行锁定首先执行:exec sp_help teachers,得到表teachers的索引对象的名称,如图4.3.5。图4.3.5执行:exec sp_indexoption teachers.PK_TEACHERS,allowPageLocks,false执行成功后,系统不允许teachers的主键上加页级锁。5自我实践分别利用执行SP_Lock系统存储过程、SQL Server企业管理器、SQL Server事件探查器来观察更新事件中锁的获取与释放的过程,并解释观察到的字段意义。6. 深

45、入探讨嵌套锁好像找不到什么资料在外面的代码中由于锁既可以是直接通过语句加上去的(select,updat等),也可以通过锁定提示(holdlock,tablelock等)加上去的,这些语句和命令会对应DBMS中的表4.2.2种的哪些锁呢?可以放在自我实践中,不用每一个命令都要做,除非特殊的情况, 答案中用表的方式列出对应关系就好了。另外通过锁定提示加的锁的内容(原来在4.3节的“2)利用锁定提示来控制锁定策略”)是否移到这小节中来说?这一小节重点讨论会加什么类型的锁而4.3节主要探讨在各个隔离级别下,事务中各类锁上锁持续的时间和可能引发的问题另外“深入探讨”这一部分可以放在自我实践后面。已作相应调整观察锁状态这一节可以插入在上文的实验内容部分更新锁事实上,在观察锁状态这个问题上,觉得更新锁比较好写,其他诸如写锁、读锁等都不太好写(写出来也就一两句)。而意向锁那些又似乎在这个例子中有提及,不知道还能用什么形式表现出来。觉得这一部分是提供给同

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号