网站大量收购闲置独家精品文档,联系QQ:2885784924

第8章SQLServer_事务和锁.ppt

  1. 1、本文档共44页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章SQLServer_事务和锁分析

事务和触发器他们有时候是功能是等同的,只是实现方式不同而已 触发器应该慎用,相对来说事务的执行效率要高,因为触发器是并发的,多条语句同时执行, 而事务中, 是一句一句执行的. 如果事务结束前.出现错误.那么整个事务就会回滚. 取消之前的所有操作. 触发器对于数据来说,也不便于维护。 用事务的话. 执行第一个正常,第二个出错.可以回滚.那么第一个执行正常的 也不会更新数据. 用触发器就不一样了. 第一个或者第二个执行正常与否,与另一条无关. 一般金融机构,多用户并发系统都采用事务来出来数据,更好的保证了数据的完整性和同一性。 银行转帐 资金从帐户A转到帐户B,至少需要两步: 帐户A的资金减少 然后帐户B的资金相应增加 假定张三的帐户直接转帐1000元到李四的帐户 错误原因分析: 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作 这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行 事务是一个不可分割的工作逻辑单元 转帐过程就是一个事务。 它需要两条UPDATE语句来完成,这两条语句是一个整体,如果其中任一条出现错误,则整个转帐业务也应取消,两个帐户中的余额应恢复到原来的数据,从而确保转帐前和转帐后的余额不变,即都是1001元。 隔离性(Isolation):在事务完成前,它对数据库的修改对其它事务必定不可见。这表明事务是必须独立的,它不应以任何方式依赖于或影响其他事务。在并发数据操作时,不同的事务拥有各自数据空间,它们的操作不会对对方产生干扰。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性越好,但并发性越弱。 持久性(Durabiliy) :事务的持久性意味着只有当事务提交以后,操作才会完成。如果系统相关事务刚刚完成后崩溃或重新启动,则必须保证对数据所做的修改不受其的影响。 事务控制 BEGIN TRANSACTION:该语句标记一个显 式事务的开始点,即事务开始。其语法如下: BEGIN { TRAN | TRANSACTION }  [ { transaction_name | @tran_name_variable }  [ WITH MARK [ description ] ]????][ ; ] COMMIT TRANSACTION:该语句标志一个成功的隐性事务或显式事务的结束,即事务提交 其语法如下: COMMIT { TRAN | TRANSACTION }  [ transaction_name | @tran_name_variable ] ][ ; ] 事务控制 ROLLBACK TRANSACTION :该语句将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。其语法如下: ROLLBACK { TRAN | TRANSACTION } ?????[ transaction_name | @tran_name_variable ?????| savepoint_name | @savepoint_variable ] [ ; ] 使用事务解决银行转帐问题 Print ‘查看转账事务之前的余额’ Select * FROM bank BEGIN TRANSACTION /*--定义变量,用于累计事务执行过程中的错误--*/ DECLARE @errorSum INT SET @errorSum=0 --初始化为0,即无错误 /*--转帐:张三的帐户少1000元,李四的帐户多1000元*/ UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=张三 SET @errorSum=@errorSum+@@error UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四 SET @errorSum=@errorSum+@@error --累计是否有错误 Print ‘查看转账事务中的余额’ Select * FROM bank IF @errorSum0 --如果有错误 BEGIN print 交易失败,回滚事务 ROLLBACK TRANSACTION END ELSE BEGIN print 交易成功,提交事务,写入硬盘,永久的保存 COMMIT TRANSACTION END GO print 查看转帐事务后的余额 SELECT * FROM bank GO 演示:转帐1000,转帐失败的情况 转帐800,转帐成功的情况: 事务的嵌套 虽然事务支

文档评论(0)

10577 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档