西北工业大学大数据库实验报告材料7.docx

上传人:b****3 文档编号:1192864 上传时间:2022-10-18 格式:DOCX 页数:11 大小:141.42KB
下载 相关 举报
西北工业大学大数据库实验报告材料7.docx_第1页
第1页 / 共11页
西北工业大学大数据库实验报告材料7.docx_第2页
第2页 / 共11页
西北工业大学大数据库实验报告材料7.docx_第3页
第3页 / 共11页
西北工业大学大数据库实验报告材料7.docx_第4页
第4页 / 共11页
西北工业大学大数据库实验报告材料7.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

西北工业大学大数据库实验报告材料7.docx

《西北工业大学大数据库实验报告材料7.docx》由会员分享,可在线阅读,更多相关《西北工业大学大数据库实验报告材料7.docx(11页珍藏版)》请在冰豆网上搜索。

西北工业大学大数据库实验报告材料7.docx

西北工业大学大数据库实验报告材料7

《数据库原理》实验报告

题目:

实验一

数据库和表的创建与管理

学号

班级

日期

2014302692

孟玉军

10011402

16.11.10

1.实验容、步骤以及结果

假设学校允许学生将银行卡和校园卡进行绑定,在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),

lanceDecimal(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分)

代码:

usestudent

begintransactionzhuanzhang

go

declarexdecimal(10,2)

selectx=balancefromicbc_cardwherestudcardid='20150032'

setx=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).丢失修改:

执行两段代码

begintransaction

declareadecimal(10,2)

selecta=balance

fromicbc_cardwherestudcardid='20150032'

waitfordelay'00:

00:

05'

updateicbc_card

setbalance=a+1wherestudcardid='20150032'

commit

select*fromicbc_card

-------------------------------------

begintransaction

declarebdecimal(10,2)

selectb=balance

fromicbc_cardwherestudcardid='20150032'

waitfordelay'00:

00:

05'

updateicbc_card

setbalance=b+2wherestudcardid='20150032'

commit

select*fromicbc_card

两段代码执行后的结果:

出现了丢失修改

2).读脏数据:

begintransaction

declarebdecimal(10,2)

selectb=balance

fromicbc_cardwherestudcardid='20150032'

updateicbc_card

setbalance=b*2wherestudcardid='20150032'

begintransaction

select*fromicbc_card

commit

rollback

select*fromicbc_card

结果显示:

3).不可重复读:

begintransaction

select*fromicbc_card

begintransaction

declarebdecimal(10,2)

selectb=balance

fromicbc_cardwherestudcardid='20150032'

updateicbc_card

setbalance=b*2wherestudcardid='20150032'

commit

select*fromicbc_card

commit

结果显示:

4).幻读

删除:

begintransaction

select*

fromicbc_card

begintransaction

deletefromicbc_card

wherestudcardid='20150032'

commit

select*

fromicbc_card

commit

结果显示:

插入:

begintransaction

select*

fromicbc_card

begintransaction

insertintoicbc_cardvalues('20150034','2015003401',1000)

commit

select*

fromicbc_card

commit

结果显示:

3.利用锁机制、数据库的隔离级别等,设计方案分别解决上述丢失修改、读脏数据和不可重复读(或者幻读)的数据不一致问题。

(30分,每种数据不一致10分,提示可以用sp_lock系统存储过程查看当前锁状况)

1).丢失修改:

begintransaction

declarebdecimal(10,2)

selectb=balance

fromicbc_cardwith(xlock)

wherestudcardid='20150032'

waitfordelay'00:

00:

05'

updateicbc_card

setbalance=b+2wherestudcardid='20150032'

commit

select*fromicbc_card

begintransaction

declareadecimal(10,2)

selecta=balance

fromicbc_cardwith(xlock)wherestudcardid='20150032'

waitfordelay'00:

00:

05'

updateicbc_card

setbalance=a+1wherestudcardid='20150032'

commit

select*fromicbc_card

成功加3,解决了丢失修改

2).读脏数据

begintran

updatecampus_cardwith(xlock)

setbalance=balance-20

wherestudcardid='20150032'

waitfordelay'00:

00:

05'

rollback

begintran

settranisolationlevelreaduncommitted

 

select*fromcampus_cardwith(holdlock)

wherestudcardid='20150032'

waitfordelay'00:

00:

05'

select*fromcampus_cardwith(holdlock)

wherestudcardid='20150032'

结果显示:

没有出现脏数据

3).不可重复读

begintran

settranisolationlevelreaduncommitted

declareb1Decimal(10,2)

declareb2Decimal(10,2)

selectb1=balancefromcampus_cardwith(holdlock)

wherestudcardid='20150032'

print('第一次数据:

'+convert(varchar,b1))

waitfordelay'00:

00:

05'

selectb2=balancefromcampus_cardwith(holdlock)

wherestudcardid='20150032'

print('第一次数据:

'+convert(varchar,b2))

begintran

updatecampus_cardwith(xlock)

setbalance=balance+100

wherestudcardid='20150032'

waitfordelay'00:

00:

03'

commit

结果显示:

消除了重复读错误

4.构造一个出现死锁的情形。

(10分)

事务一:

begintransaction

select*fromcampus_cardwith(tablockx)

waitfordelay'00:

00:

05'

select*fromicbc_cardwith(tablockx)

commit

事务二:

begintransaction

select*fromicbc_cardwith(tablockx)

waitfordelay'00:

00:

05'

select*fromcampus_cardwith(tablockx)

commit

结果:

出现了死锁

5.利用dbcclog命令查看student数据库的事务日志。

(5分)

dbcclog(student)

2.实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)

除了标题容以外,该部分容中还可以写对于实验的一些感受,建议,意见等。

学会了一些事务处理的操作,理解了利用锁机制、数据库的隔离级别去解决问题。

 

批阅者:

批阅日期:

实验成绩:

批注:

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

当前位置:首页 > 工程科技 > 能源化工

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

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