数据库实验报告7

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

假设学校允许学生将银行卡和校园卡进行绑定,在 student 数据库中有如下的基本表,其中校园卡编号 cardid 即为学生的学号: icbc_card(studcardid,icbcid,balance) //

校园卡 ID,工行卡 ID,银行卡余额 campus_card(studcardid,balance) //校园卡 ID,校园卡余额数据创建的代码:

1.编写一个事务处理(begin tran)实现如下的操作:某学号为20150032的学生要从银

行卡中转账200元到校园卡中,若中间出现故障则进行rollback。(15分)

修改后的结果:

2.针对本题的数据库和表,分别用具体的例子展现四种数据不一致问题:丢失修改、

读脏数据、不可重复读和幻读(删除和插入)。(40分,每种数据不一致10分)丢失修改:

--事务一:

begin tran

declare @balance decimal(10,2)

select @balance=balance from campus_card where studcardid='20150033'

waitfor delay'00:00:05'

set @balance=@balance-10

update campus_card

set balance=@balance where studcardid='20150033'

commit tran

go

select balance from campus_card where studcardid='20150033'

--事务二:

begin tran

declare @balance1 decimal(10,2)

select @balance1=balance from campus_card where studcardid='20150033' set @balance1=@balance1-20

update campus_card set balance=@balance1 where studcardid='20150033' commit tran

go

select balance from campus_card where studcardid='20150033'

【事务 1】更改了数据,结果为 60,但是没有被读到。最终【事务 2】的结果 50 覆盖了【事务 1】的更改值,结果不是期望值 40

读脏数据

--事务一:

begin tran

declare @balance decimal(10,2)

select @balance=balance from campus_card where studcardid='20150032' update campus_card

set balance=@balance+100 where studcardid='20150032'

waitfor delay'00:00:05'

rollback tran--回滚

--事务一:

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

--事务二:

begin tran

update campus_card set balance=balance+200

where studcardid='20150031'

commit tran

select balance from campus_card where studcardid='20150031'

事务二对数据的改变影响了事物一两次读取数据的值,使读取数据产生错误

幻读

➢插入

--事务一:

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

--事务二:

begin tran

insert into campus_card values('20150031', 30)

commit tran

➢删除

--事务一:

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

--事务二:

begin tran

delete from campus_card 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 eread

幻读在 SQL 语句前加可串行读:

set tran isolation level serializable

4.构造一个出现死锁的情形。(10分)

set tran isolation level read committed

相关文档
最新文档