数据库实验报告事务与并发控制.docx
- 文档编号:5816529
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:10
- 大小:140.32KB
数据库实验报告事务与并发控制.docx
《数据库实验报告事务与并发控制.docx》由会员分享,可在线阅读,更多相关《数据库实验报告事务与并发控制.docx(10页珍藏版)》请在冰豆网上搜索。
数据库实验报告事务与并发控制
《数据库原理》实验报告
题目:
实验七
事务与并发控制
学号
姓名
班级
日期
2013302478
纪昌宇
10011301
2015.11.14
1.实验七:
事务与并发控制
1.1.实验目的
1.掌握事务机制,学会创建事务。
2.理解事务并发操作所可能导致的数据不一致性问题,用实验展现四种数据不一致性问题:
丢失修改、读脏数据、不可重复读以及幻读现象。
3.理解锁机制,学会采用锁与事务隔离级别解决数据不一致的问题。
4.了解数据库的事务日志。
1.2.实验内容
假设学校允许学生将银行卡和校园卡进行绑定,在student数据库中有如下的基本表,其中校园卡编号cardid即为学生的学号:
icbc_card(studcardid,icbcid,balance)//校园卡ID,工行卡ID,银行卡余额
campus_card(studcardid,balance)//校园卡ID,校园卡余额
数据创建的代码:
usestudent
createtablecampus_card
(studcardidChar(8),
balanceDecimal(10,2))
createtableicbc_card
(
studcardidChar(8),
icbcidChar(10),
balanceDecimal(10,2)
)
insertintocampus_cardvalues('20150031',30)
insertintocampus_cardvalues('20150032',50)
insertintocampus_cardvalues('20150033',70)
insertintoicbc_cardvalues('20150031','2015003101',1000)
insertintoicbc_cardvalues('20150032','2015003201',1000)
insertintoicbc_cardvalues('20150033','2015003301',1000)
针对以上数据库按照要求完成下列实验:
1.编写一个事务处理(begintran)实现如下的操作:
某学号为20150032的学生要从银行卡中转账200元到校园卡中,若中间出现故障则进行rollback。
(15分)
settransactionisolationlevel
repeatableread
begintransaction
usestudent
go
declare@xdecimal(10,2)
select@x=balance
fromicbc_card
wherestudcardid='20150032'
set@x=@x-200
if(@x>=0)
begin
updateicbc_cardsetbalance=@xwherestudcardid='20150032'
updatecampus_cardsetbalance=balance+200wherestudcardid='20150032'
committran
end
else
begin
print'余额不足,不能转账'
rollbacktran
end
2.针对本题的数据库和表,分别用具体的例子展现四种数据不一致问题:
丢失修改、读脏数据、不可重复读和幻读(删除和插入)。
(40分,每种数据不一致10分)
(1).丢失修改
--事务1
begintran
declare@balancedecimal(10,2)
select@balance=balancefromcampus_cardwherestudcardid='20150033'
waitfordelay'00:
00:
05'
set@balance=@balance-10
updatecampus_cardsetbalance=@balancewherestudcardid='20150033'
committran
go
selectbalancefromcampus_cardwherestudcardid='20150033'
--事务2
begintran
declare@balance1decimal(10,2)
select@balance1=balancefromcampus_cardwherestudcardid='20150033'
waitfordelay'00:
00:
05'
set@balance1=@balance1-20
updatecampus_cardsetbalance=@balance1wherestudcardid='20150033'
committran
go
selectbalancefromcampus_cardwherestudca
【事务1】更改了数据,结果为60,但是没有被读到。
最终【事务2】的结果50覆盖了【事务1】的更改值,结果不是期望值40
(2).读脏数据
--事务1
SETTRANSACTIONISOLATIONLEVELREADUNCOMMITTED
--READUNCOMMITTED执行脏读,不发出共享锁,也不接受排他锁
begintran
declare@balancedecimal(10,2)
select@balance=balancefromcampus_cardwherestudcardid='20150032'
updatecampus_cardsetbalance=@balance+100wherestudcardid='20150032'
waitfordelay'00:
00:
05'
rollbacktran--回滚
go
selectbalancefromcampus_cardwherestudcardid='20150032'
--事务2
SETTRANSACTIONISOLATIONLEVELREADUNCOMMITTED
begintran
declare@balancedecimal(10,2)
select@balance=balancefromcampus_cardwherestudcardid='20150032'
updatecampus_cardsetbalance=@balance+50wherestudcardid='20150032'
committran
go
selectbalancefromcampus_cardwherestudcardid='20150032'
【事务1】更改了数据,【事务2】读取了表中更改后的值再进行操作,【事务1】回滚。
最终的表存储了错误结果。
(3)不可重复读
--事务1
SETTRANSACTIONISOLATIONLEVELREADCOMMITTED
begintran
selectbalancefromcampus_cardwherestudcardid='20150031'
waitfordelay'00:
00:
05'
selectbalancefromcampus_cardwherestudcardid='20150031'
committran
--事务2
SETTRANSACTIONISOLATIONLEVELREADCOMMITTED
begintran
updatecampus_cardsetbalance=balance+200wherestudcardid='20150031'
committran
【事务1】读取了数据,【事务2】更改数据,【事务1】再读取数据。
【事务1】两次读取都不一样!
(4).幻读
插入
--事务1
SETTRANSACTIONISOLATIONLEVELREADCOMMITTED
begintran
selectbalancefromcampus_cardwherestudcardid='20150031'
waitfordelay'00:
00:
05'
selectbalancefromcampus_cardwherestudcardid='20150031'
committran
--事务2
SETTRANSACTIONISOLATIONLEVELSERIALIZABLE
begintran
insertintocampus_cardvalues('20150031',30)
committran
删除
--事务1
SETTRANSACTIONISOLATIONLEVELREADCOMMITTED
begintran
selectbalancefromcampus_cardwherestudcardid='20150031'
waitfordelay'00:
00:
05'
selectbalancefromcampus_cardwherestudcardid='20150031'
committran
--事务2
settranisolationlevelrepeatableread
begintran
deletefromcampus_cardwherestudcardid='20150031'
committran
3.利用锁机制、数据库的隔离级别等,设计方案分别解决上述丢失修改、读脏数据和不可重复读(或者幻读)的数据不一致问题。
(30分,每种数据不一致10分,提示可以用sp_lock系统存储过程查看当前锁状况)
修改隔离级别以却确定数据的正确性:
丢失修改,在SQL语句前加未提交读:
settranisolationlevelreaduncommitted
读脏数据,在SQL语句前已提交读:
settranisolationlevelreadcommitted
不可重复读,在SQL语句前可重复读:
settranisolationlevelrepeatableread
幻读在SQL语句前加可串行读:
settranisolationlevelserializable
4.构造一个出现死锁的情形。
(10分)
首先将锁的级别改为提交可读
settranisolationlevelreadcommitted
--事务1
begintran
declare@readint
select@read=grade
fromsc
wheresno='95003'
waitfordelay'00:
00:
10'
updatesc
setgrade=@read-1
wheresno='95003'
--事务2
begintran
declare@readint
select@read=grade
fromsc
wheresno='95003'
updatesc
setgrade=@read-1
wheresno='95003'
5.利用dbcclog命令查看student数据库的事务日志。
(5分)
DBCClog('student',TYPE=2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 实验 报告 事务 并发 控制