《数据库原理》实验报告
实验七:
事务与并发控制
学号
姓名
班级
日期
杨添文
实验七:事务与并发控制
实验内容
假设学校允许学生将银行卡和校园卡进行绑定,在student数据库中有如下的基本表,其中校园卡编号cardid即为学生的学号:
icbc_card(studcardid,icbcid,balance) //校园卡ID,工行卡ID,银行卡余额
campus_card(studcardid,balance) //校园卡ID,校园卡余额
针对以上数据库按照要求完成下列实验:
编写一个事务处理(begin tran)实现如下的操作:某学号为的学生要从银行卡中转账200元到校园卡中,若中间出现故障则进行rollback。(15分)
程序代码如下:
declare ***@balance int
select ***@balance=balance-200
from icbc_card
where studcardid=''
update icbc_card
set balance=***@balance
where studcardid=''
update campus_card
set balance=balance+200
where studcardid=''
if ***@balance<0
rollback
commit;
(2)结果如下:
(结果很明显,阴影部分即显示操作已成功。)
针对本题的数据库和表,分别用具体的例子展现四种数据不一致问题:丢失修改、读脏数据、不可重复读和幻读(删除和插入)。(40分,每种数据不一致10分)
丢失修改:
代码如下:
set tran isolation level read uncommitted
declare ***@balance int
select ***@balance=balance
from icbc_card
where studcardid=''
waitfor delay '00:00:10'
update icbc_card
set balance=***@balance-300
where studcardid=''
select balance
from icbc_card
where studcardid=''
这段代码执行的时间设置为10秒,在此期间,重复执行这段代码(可以增加一个窗口,在10秒内执行),结果如下截图:
很明显,若是成功修改,balance中的数据就会是400,而不是700。
读脏数据:
代码如下:(两个事务的执行时间间隔不超过10秒)
1、先编写代码执行事务1(执行一次对balance的操作,回滚)
set tran isolation level read uncommitted
begin tran
update icbc_card
set balance=balance+2000
where studcardid=''
select balance
from icbc_card
数据库实验报告四 来自淘豆网m.daumloan.com转载请标明出处.