[哲学]数据库原理课件 第四章 数据库事务.doc
《[哲学]数据库原理课件 第四章 数据库事务.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得到的数据就与数据库内的数据不一致。这种不一致或者不存在的数据通常就称为“脏”数据。读“脏”数据是由于一个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哲学 哲学数据库原理课件 第四章 数据库事务 数据库 原理 课件 第四 事务

链接地址:https://www.31ppt.com/p-4665248.html