日期:2014-05-17  浏览次数:20681 次

关于事务隔离性级别的问题
考虑关系Employee(ID,salary), 表示职工的工资号和工资数额,开始Employee关系中有两个元组(A,20)和(B,30)。
现有如下两个事务T1、T2,
T1: begin transaction;
update Employee set salary = 2*salarywhere ID=’A’;
update Employee set salary =salary+10 where ID=’A’;
commit;
T2:begin transaction;
selectsum(salary) as sal1 from Employee;
selectsum(salary) as sal2 from Employee;
commit;
给出T2返回的sal1与sal2所有可能的值的情况,如果T2运行的隔离性级别为
serializable
readcommitted
read uncommitted

求大神给讲解一下!十分感激!

------解决方案--------------------
http://technet.microsoft.com/zh-cn/library/ms173763.aspx
------解决方案--------------------
你是考虑并发性还是想了解事物之间的隔离性?
readuncommitted就不说了

readcommitted隔离级别下,T1会阻塞T2,也就是说,T1未提交时,T2会等待,直到T1提交
写会阻塞读,只有写提交之后,读才能执行

置于更高隔离级别的repeatable 以及serializable,本质都是读数据库加的共享锁的释放时间

比如repeatable 与readcommitted相比,共享锁释放的时间就比较晚,repeatable 是在事务提交后才释放
而readcommitted的共享锁,读完即释放

置于serializable,直接加“范围锁”,制定事务执行过程中,当前事务执行时,
其他事物不允许往改范围内插入数据或者修改数据


------解决方案--------------------
条件不足,无法判断.
结果还与以下因素有关,
 1.Employee表的索引情况.
 2.T1的事务隔离等级.
 3.T1与T2的开始时间.
------解决方案--------------------
如果T1先于T2执行,在serializable、readcommitted这两种情况下,T2会等到T1完成才执行,也就是说update后的值,read uncommitted的话,如果在T2运行时T1还在运行,那么读取的是T1中已经完成的操作,但是一旦T1失败回滚,T2再次查询时数据就可能不一样,这里还要看两个事务的运行时间。

如果T1后于T2执行,那就要测试一下,不过和上面说的一样,要看很多情况,特别是持续时间。最好的答案就是:自行测试,具体问题只有具体环境才有最佳答案