实验六事务与并发控制.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验六事务与并发控制

实验六 事务与并发控制 班级:软件1412 姓名:王茂潭 学号:1411651214 一.实验目的 理解事务的基本概念 掌握定义事务和使用事务的方法。 验证并发操作带来的数据不一致性。 了解锁机制。 二.实验内容 1.定义事务,将课程表中的“数据库”课程名称改为“数据库原理”,并提交该事务。 2.定义事务,删除授课表和教师表中教师号为“120578”的记录,并提交该事务。 3.设计事务验证并发操作带的数据不一致性。 设计账户表account,表结构如表1所示,表中数据如表2所示。 表1 account数据表结构 列名称说明数据类型id账号,主码intbalance账户余额int 表2 account表的数据 idbalance1201100012021000 (1)分别新建2个查询,定义2个事务。事务1从1201账户取出100元,在事务1提交之前,事务2又从1201账户取到50元,然后读取账户表,最后分别提交事务1和事务2。程序样例中并发控制一和二,哪个会出现丢失修改?为什么? 注:在事务1中,使用“WAITFOR DELAY”等待事务2的执行,以模拟并发操作。 (2)分别新建2个查询,定义2个事务。事务1读取账户余额。事务2从1201账户取出100元,然后事务1再次读账户余额,最后分别提交事务1和事务2。程序样例中的并发控制程序执行后,分析事务1两次读取的账户余额是否一致,会出现不可重复读吗? 注:在事务1中,使用“WAITFOR DELAY”等待事务2的执行,以模拟并发操作。 (3)分别新建2个查询,定义2个事务。事务1从1201账户取出100元,事务2读账户余额,然后事务1回滚事务,最后分别提交事务1和事务2。程序样例中的并发控制程序执行后,事务2读取的账户余额与数据库中的数据是否一致,会出现读脏数据吗? 注:在事务1中,使用“WAITFOR DELAY”等待事务2的执行,以模拟并发操作;在定义事务之前,使用“SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”重新设置事务的隔离级别。 4.解决3中出现的数据不一致问题 (1)在从账户取钱之前,为账户表加上排它锁,以解决丢失修改问题。 (2)设置隔离级别“SET TRANSACTION ISOLATION LEVEL REPEATABLE READ”,以解决不可重复读问题。 (3)设置隔离级别“SET TRANSACTION ISOLATION LEVEL READ COMMITTRED”,以解决读脏数据问题。 程序样例: 3.(1)并发控制一 begin transaction /*事务T1*/ declare @sum float update account set balance= balance -100 where id=1201 /*从1201账户取出100元*/ waitfor delay 00:00:10 set @sum=(select balance from account where id=1201) if @sum0 rollback else commit /*余额不足*/ begin transaction /*事务T2*/ declare @sum float update account set balance= balance -50 where id=1201 /*从1201账户取出50元*/ set @sum=(select balance from account where id=1201) if @sum0 rollback else commit/*余额不足*/ 并发控制二 begin transaction /*事务T1*/ declare @sum float set @sum=(select balance WITH (tablockx) from account where id=1201) waitfor delay 00:00:10 update account set balance=@sum-100 where id=1201 /*从1201账户取出100元*/ if @sum-1000 rollback else commit/*余额不足*/ begin transaction /*事务T2*/ declare @sum float set @sum=(select balance from account where id=1201) update account set balance=@sum-50 where id=1201 /*从1201账户取出100元*/ if

文档评论(0)

kaiss + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档