版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据库原理实验报告题目:实验七事务与并发控制学号姓名班级日期2013302478纪昌宇100113012015.11.141. 实验七:事务与并发控制1.1. 实验目的1. 掌握事务机制,学会创建事务。2. 理解事务并发操作所可能导致的数据不一致性问题,用实验展现四种数据不一致性问题:丢失修改、读脏数据、不可重复读以及幻读现象。3. 理解锁机制,学会采用锁与事务隔离级别解决数据不一致的问题。4. 了解数据库的事务日志。1.2. 实验内容 假设学校允许学生将银行卡和校园卡进行绑定,在student数据库中有如下的基本表,其中校园卡编号cardid即为学生的学号: icbc_card(studca
2、rdid,icbcid,balance) /校园卡ID,工行卡ID,银行卡余额 campus_card(studcardid,balance) /校园卡ID,校园卡余额数据创建的代码: use studentcreate table campus_card( studcardid Char(8) , balance Decimal(10,2)create table icbc_card( studcardid Char(8), icbcid Char(10), balance Decimal(10,2) ) insert into campus_card values('2015003
3、1', 30)insert into campus_card values('20150032', 50)insert into campus_card values('20150033', 70)insert into icbc_card values('20150031', '2015003101', 1000)insert into icbc_card values('20150032', '2015003201', 1000)insert into icbc_card values(
4、'20150033', '2015003301', 1000) 针对以上数据库按照要求完成下列实验:1. 编写一个事务处理(begin tran)实现如下的操作:某学号为20150032的学生要从银行卡中转账200元到校园卡中,若中间出现故障则进行rollback。(15分)set transaction isolation levelrepeatable readbegin transactionuse studentgodeclare x decimal(10, 2)select x=balance from icbc_cardwhere studcardi
5、d='20150032'set x=x-200 if(x>=0) begin update icbc_card set balance=x where studcardid='20150032' update campus_card set balance=balance+200 where studcardid='20150032' commit tran end else begin print '余额不足,不能转账' rollback tran end2. 针对本题的数据库和表,分别用具体的例子展现四种数据不一致问题:
6、丢失修改、读脏数据、不可重复读和幻读(删除和插入)。(40分,每种数据不一致10分)(1).丢失修改-事务1begin trandeclare balance decimal(10,2)select balance=balance from campus_card where studcardid='20150033'waitfor delay '00:00:05'set balance=balance-10update campus_card set balance=balance where studcardid='20150033'comm
7、it trangoselect balance from campus_card where studcardid='20150033'-事务2begin trandeclare balance1 decimal(10,2)select balance1=balance from campus_card where studcardid='20150033'waitfor delay '00:00:05'set balance1=balance1-20update campus_card set balance=balance1 where st
8、udcardid='20150033'commit trangoselect balance from campus_card where studca 【事务1】更改了数据,结果为60,但是没有被读到。最终【事务2】的结果50覆盖了【事务1】的更改值,结果不是期望值40(2).读脏数据-事务1 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED -READ UNCOMMITTED 执行脏读,不发出共享锁,也不接受排他锁begin tran declare balance decimal(10,2) select balance=b
9、alance from campus_card where studcardid='20150032' update campus_card set balance=balance+100 where studcardid='20150032' waitfor delay '00:00:05' rollback tran -回滚 goselect balance from campus_card where studcardid='20150032' -事务2 SET TRANSACTION ISOLATION LEVEL REA
10、D UNCOMMITTED begin tran declare balance decimal(10,2) select balance=balance from campus_card where studcardid='20150032' update campus_card set balance=balance+50 where studcardid='20150032' commit tran goselect balance from campus_card where studcardid='20150032' 【事务1】更改了数
11、据,【事务2】读取了表中更改后的值再进行操作,【事务1】回滚。最终的表存储了错误结果。 (3)不可重复读 -事务1 SET TRANSACTION ISOLATION LEVEL READ COMMITTED begin tran select balance from campus_card where studcardid='20150031' waitfor delay '00:00:05' select balance from campus_card where studcardid='20150031'commit tran -事务2
12、 SET TRANSACTION ISOLATION LEVEL READ COMMITTED begin tran update campus_card set balance=balance+200 where studcardid='20150031' commit tran 【事务1】读取了数据,【事务2】更改数据,【事务1】再读取数据。【事务1】两次读取都不一样!(4).幻读 插入 -事务1 SET TRANSACTION ISOLATION LEVEL READ COMMITTED begin tran select balance from campus_card
13、 where studcardid='20150031' waitfor delay '00:00:05' select balance from campus_card where studcardid='20150031'commit tran -事务2 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE begin tran insert into campus_card values('20150031', 30) commit tran 删除-事务1 SET TRANSACTION
14、ISOLATION LEVEL READ COMMITTED begin tran select balance from campus_card where studcardid='20150031' waitfor delay '00:00:05' select balance from campus_card where studcardid='20150031'commit tran -事务2 set tran isolation level repeatable read begin tran delete from campus_ca
15、rd where studcardid='20150031'commit tran 3. 利用锁机制、数据库的隔离级别等,设计方案分别解决上述丢失修改、读脏数据和不可重复读(或者幻读)的数据不一致问题。(30分,每种数据不一致10分,提示可以用sp_lock系统存储过程查看当前锁状况)修改隔离级别以却确定数据的正确性:丢失修改,在SQL语句前加未提交读:set tran isolation level read uncommitted读脏数据,在SQL语句前已提交读:set tran isolation level read committed不可重复读,在SQL语句前可重复读:set tran isolation level repeatable read幻读在SQL语句前加可串行读:set tran isolation level serializable4. 构造一个出现死锁的情形。(10分) 首先将锁的级别改为提交可读set tran isolation level read committed-事务1begin trandeclare read intselect read=gradefrom scwhere sno='95003'waitfor delay '00:00:10'update s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山西省晋城市部分学校2024-2025学年高二上学期12月月考英语试卷(含答案无听力原文及音频)
- 江苏省盐城市潘黄实验学校 苏科版物理八年级上册 八年级第一学期期末质量检测物 理(含答案)
- 河北省邢台市部分高中2024-2025学年高三(上)期末物理试卷(含答案)
- 2024版海鲜干货购销合同范本
- 2024版办公室保洁人员雇佣协议
- 2024精简版聘用协议:高效规范格式版
- 福建省南平市剑津中学高一数学文月考试卷含解析
- 2024年一级造价师之建设工程技术与计量(交通)题库含答案(a卷)
- 2024特色农业产品销售合同标的
- 2024版医院合同管理规定
- 2025年四川长宁县城投公司招聘笔试参考题库含答案解析
- 2024年06月上海广发银行上海分行社会招考(622)笔试历年参考题库附带答案详解
- TSG 51-2023 起重机械安全技术规程 含2024年第1号修改单
- 计算机科学导论
- 浙江省杭州市钱塘区2023-2024学年四年级上学期英语期末试卷
- 《工程勘察设计收费标准》(2002年修订本)
- 2024年一级消防工程师《消防安全技术综合能力》考试真题及答案解析
- 2024-2025学年六上科学期末综合检测卷(含答案)
- 安徽省森林抚育技术导则
- 2023七年级英语下册 Unit 3 How do you get to school Section A 第1课时(1a-2e)教案 (新版)人教新目标版
- 泌尿科主任述职报告
评论
0/150
提交评论