数据库实验报告事务与并发控制.docx

上传人:b****6 文档编号:5816529 上传时间:2023-01-01 格式:DOCX 页数:10 大小:140.32KB
下载 相关 举报
数据库实验报告事务与并发控制.docx_第1页
第1页 / 共10页
数据库实验报告事务与并发控制.docx_第2页
第2页 / 共10页
数据库实验报告事务与并发控制.docx_第3页
第3页 / 共10页
数据库实验报告事务与并发控制.docx_第4页
第4页 / 共10页
数据库实验报告事务与并发控制.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

数据库实验报告事务与并发控制.docx

《数据库实验报告事务与并发控制.docx》由会员分享,可在线阅读,更多相关《数据库实验报告事务与并发控制.docx(10页珍藏版)》请在冰豆网上搜索。

数据库实验报告事务与并发控制.docx

数据库实验报告事务与并发控制

《数据库原理》实验报告

题目:

实验七

事务与并发控制

学号

姓名

班级

日期

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)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1