《数据库原理与应用》11.事务和游标的创建和使用.ppt
《《数据库原理与应用》11.事务和游标的创建和使用.ppt》由会员分享,可在线阅读,更多相关《《数据库原理与应用》11.事务和游标的创建和使用.ppt(59页珍藏版)》请在三一办公上搜索。
1、孙 发 勤 扬州大学新闻与传媒学院Y,数据库原理与应用第十一讲 事务和游标的创建和使用,创建事务提交事务回滚事务回滚事务的一部分用锁理解死锁声明游标打开游标从游标取数据关闭游标,本讲主要内容,例:一个员工代码为000002的内部候选人已经被选定为Sales Manager(岗位代码为0001)岗位。这必须在Employee表中被更新,当前已在该岗位的人数也需要在Position表中更新。上面要做的UPDATE语句如下:UPDATE EmployeeSET cCurrentPosition=0001WHERE cEmployeeCode=000002UPDATE PositionSET iCur
2、rentStrength=iCurrentStrength+1WHERE cPositionCode=0001,系统崩溃是由于两个更新之间导致数据不一致性而引起的。需要防止这种情况,要确保两个更新或者都发生或者都不发生。,问题:怎样防止数据的不一致性?执行事务 验证数据在两个表中都已更新,怎样防止数据的不一致性?事务一个事务可以被定义为作为工作的单个的逻辑单元被一起执行的一串的操作。单个的工作单元必须具有称为ACID(原子性,一致性,独立性,和持久性)的四个性质原子性一致性独立性持久性,怎样防止数据的不一致性(续)为实现ACID性质的需求,SQL Server提供了下面的特性:事务管理上锁日志
3、事务日志-是SQL Server管理所有它的的事务而维护的日志显式事务-是事务的开始和结束都被显式地定义的事务。,怎样防止数据的不一致性(续)BEGIN TRANSACTION:该语句标志显示事务的开始语法BEGIN TRANSACTION transaction_name|tran_name_variableCOMMIT TRANSACTION或 COMMIT WORK:语句标志显式事务的结束点语法 COMMIT TRANSACTIONtransaction_name|tran_name_variable,怎样防止数据的不一致性(续)Autocommit事务autocommit模式是SQL
4、Server的缺省事务管理模式,当使用SET AUTOCOMMIT OFF开启事务支持时,所有insert,delete或update操作列表存储在内存中,因此,当进行ROLLBACK事务时,这些操作能够被撤销。跨越几百个数据改变的事务将会花费很多的内存知道下一个COMMIT或ROLLBACK清除了操作列表。结果:事务的使用可以避免数据的不一致性UPDATE语句可通过使用BEGIN TRANSACTION和COMMIT TRANSACTION语句来维持其原子性,执行事务动作:在 Query Analyzer窗口中,键入:BEGIN TRANSACTION trnUpdatePositionUP
5、DATE Employee SET cCurrentPosition=0001 WHERE cEmployeeCode=000002 UPDATE Position SET iCurrentStrength=iCurrentStrength+1 WHERE cPositionCode=0001 COMMIT TRANSACTION trnUpdatePosition,验证两个表中的数据都已被更新动作:下面的SELECT语句来验证那些行已被更新:SELECT*FROM PositionWHERE cPositionCode=0001SELECT*FROM Employee WHERE cEmpl
6、oyeeCode=000002,识别下面单个工作单元的性质:由并发事务引起的任何数据修改必须与其他并发事务所作的修改隔离开来所有的数据修改都被执行或者都没有被执行已完成事务的任何数据改变在系统中永久起作用事务成功地完成后所有的数据必须处于一致的状态,2.回复改变职位0015已经招募了10个候选人。为了反映这一变化,对于RequisitionCode 0015,Requisition表的NuOfRequir属性将会减少10。还有,对于cPositionCode 0015,Position表的iCurrentStrength属性要加10,使用下面命令:UPDATE Requisitionset N
7、uOfRequir=NuOfRequir-10WHERE RequisitionCode=0015,2.回复改变(续)UPDATE Positionset iCurrentStrength=iCurrentStrength+10WHERE cPositionCode=0015这两个语句都应该是原子的,如果iCurrentStrength属性变得不只是iCurrentStrength属性,那么,由UPDATE语句所作的改变必须回复。,识别怎样恢复所作的改变执行事务验证事务是否被执行,如何回复所作的改变?ROLLBACK TRANSACTION或 ROLLBACK WORK:这些语句把显式的或隐式
8、的事务回滚到事务的开始,或者回滚到事务内的保存点语法ROLLBACK TRANSACTION transaction_name|tran_name_variable|savepoint_name|savepoint_variable结果事务可用ROLLBACK TRANSACTION语句回复,BEGIN TRANSACTIONUPDATE RequisitionSET NuOfRequir=NuOfRequir-10WHERE cRequisitionCode=0015UPDATE PositionSET iCurrentStrength=iCurrentStrength+10WHERE cP
9、ositionCode=0015IF(SELECT iMaxStrength-iCurrentStrength FROM Position WHERE cPositionCode=0015)0 BEGINPRINT Current strength cannot be more than Max strength.Transaction has not been committed.ROLLBACK TRANSACTION ENDELSE BEGINPRINT The transaction has been committed.COMMIT TRANSACTION END,验证事务是否被执行
10、动作:查看结果窗口中所显示的输出。,3.回复事务的一部分Employee和Position表需要用下面的事务来更新:事务1:UPDATE EmployeeSET cCurrentPosition=0015WHERE cEmployeeCode=000002UPDATE PositionSET iCurrentStrength=iCurrentStrength+1WHERE cPositionCode=0015Requisition 和Position表需要使用下面的事务来更新:事务 2:UPDATE Requisition SET NuOfRequir=NuOfRequir-10 WHERE
11、cRequisitionCode=0015UPDATE Position SET iCurrentStrength=iCurrentStrength+10 WHERE cPositionCode=0015,3回复事务的一部分(续)所有更新应一起来做。对于cPositionCode 0015,如果iCurrentStrength值大于iMaxStrength值,由第二个事务所产生的改变必须被回复,而由第一个事务产生的改变是允许的。,识别怎样把事务分解成部分执行事务验证事务的执行,怎样把事务分解成部分?保存事务它在事务内设置保存点。保存点把事务分成几个逻辑单元,这样事务可以返回到保存点,如果事务的
12、一部分是有条件地被取消。语法SAVE TRANSACTION savepoint_name|savepoint_variable结果事务可以用SAVE TRANSACTION语句分解成几个逻辑单元,保存点提供了一种机制,用于回滚部分事务。可以使用 SAVE TRANSACTION savepoint_name 语句创建一个保存点,然后再执行 ROLLBACK TRANSACTION savepoint_name 语句回滚到该保存点,从而无须回滚到事务的开始。在不可能发生错误的情况下,保存点很有用。在很少出现错误的情况下使用保存点回滚部分事务,比让每个事务在更新之前测试更新的有效性更为有效。更新
13、和回滚操作代价很大,因此只有在遇到错误的可能性很小,而且预先检查更新的有效性的代价相对很高的情况下,使用保存点才会非常有效。,BEGIN TRANSACTION UPDATE Employee SET cCurrentPosition=0015 WHERE cEmployeeCode=000002UPDATE Position SET iCurrentStrength=iCurrentStrength+1 WHERE cPositionCode=0015 SAVE TRANSACTION trnTransaction1 UPDATE Requisition SET NuOfRequir=NuO
14、fRequir-10 WHERE cRequisitionCode=0015 UPDATE Position SET iCurrentStrength=iCurrentStrength+10 WHERE cPositionCode=0015,IF(SELECT iMaxStrength-iCurrentStrength FROM Position WHERE cPositionCode=0015)0 BEGINPRINT Transaction 1 has been committed but transaction 2 has not been ommitted.ROLLBACK TRANS
15、ACTION trnTransaction1 ENDELSE BEGINRINT Both the transactions have been committed.COMMIT TRANSACTION END,验证事务的执行动作:查看在结果窗口中显示的输出。,4.体验上琐的用法User1给出下面的语句来更新ExternalCandidate表中的材料,表中有cCandidateCode000002的候选人参加测试后的测试分数和测试日期。BEGIN TRANSACTIONUPDATE ExternalCandidate SET siTestScore=90 WHERE cCandidateCo
16、de=000002UPDATE ExternalCandidate SET dTestDate=getdate()WHERE cCandidateCode=000002COMMIT TRANSACTION,4体验上琐的用法(续)当上面的事务被执行时,User2要安排一个候选人来面试,但是不能查看高于80分候选人的材料。他/她用下面的语句来查看材料和安排面试:BEGIN TRANSACTION SELECT*from ExternalCandidate WHERE siTestScore 80 UPDATE ExternalCandidate SET dInterviewDate=getdate
17、()+2 WHERE siTestScore 80 COMMIT TRANSACTION,User2为什么不能执行此事务?,为什么User2不能执行此事务?上锁确保事务的完整性和数据库的一致性是自动实施的不上锁,查看事务处理是不可能的。,为什么User2不能执行此事务(续)事务的并发性SQL Server提供了乐观的和悲观的并发性控件乐观并发性控件建立在多用户间资源冲突大概是不可能的假设的基础上允许事务执行不用锁定任何资源只有在提交事务时才进行资源检查,为什么User2不能执行此事务(续)悲观并发性控件在事务处理期间的锁定资源并发性问题丢失更新丢失更新问题发生在当两个或多个事务基于原先所选值试
18、图修改同一行的时候自由依赖性自由依赖性问题(uncommitted dependency)也称为无效读入(dirty read)问题,为什么User2不能执行此事务(续)不一致性分析不一致性分析问题又称为 不可重复问题幻象读取幻象读取又称为作幻象问题,为什么User2不能执行此事务(续)SQL Server锁模型共享锁允许并发事务来读取资源更新锁避免了常见形式的死琐发生互斥型锁唯一地限制并发事务访问一个资源,为什么User2不能执行此事务(续)意向锁指示SQL Server要在层次结构较低的某个资源上获得一个共享或排它锁模式锁当任何数据定义(DDL)操作在表上执行时,SQL Server考察模
19、式修改(Sch-M)锁,为什么User2不能执行此事务(续)结果:User2不能执行他的事务,因为当它正在被User1使用时SQL Server已经锁定了ExternalCandidate表,死锁死锁是这样一种情形:两个用户(或事务)在个别的对象的上锁,并且每个用户正在等待另一个对象的锁,死锁(续)设置死锁优选级为探测死锁的情况,SQL Server扫描在等待锁请求的会话SQL Server提供SET DEADLOCK_PRIORITY命令来定制死锁语法SET DEADLOCK_PRIORITY LOW|NORMAL|deadlock_var控制在发生死锁情况时会话的反应方式。如果两个进程都锁
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库原理与应用 数据库 原理 应用 11. 事务 游标 创建 使用
链接地址:https://www.31ppt.com/p-5898634.html