【事务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. 利用dbcc log命令查看student数据库的事务日志。(5分)
DBCClog('student',TYPE=2)