不一致的调度(transactions..DBMS)

时间:2014-05-11 11:38:41

标签: database

最初A = 1000,B = 2000的值。当T2的第一条指令执行时,读(A)会读取950或1000吗? (因为写(A)之前没有执行)

T1           T2            
-------     --------
read(A)
A:=A-50
           read(A)
           temp: A * 0.1 
           A: A-temp
           write (A)
           read(B)


write(A)
read(B)
B:= B+ 50
write(B)


           B:=B +temp
           write(B)

1 个答案:

答案 0 :(得分:0)

在最一般的情况下,它取决于您设置的事务隔离级别,以及dbms如何实现这些隔离级别。

例如,SQL标准规定,如果将事务隔离级别设置为"读取未提交的",则可以进行脏读,不可重复读和幻像读。但是在PostgreSQL中,将隔离级别设置为"读取未提交的"实际上为你提供了" read committed"的行为。 (SQL标准允许这样;"读取已提交"是一个比#34更强的隔离级别;读取未提交的#34;。

T2的第一条指令应为1000,因为

  • T1中的更新尚未提交,
  • T2显然正在使用服务器的默认事务隔离级别和
  • 非常罕见的"读取未提交"被设置为服务器的默认事务隔离级别。

您可以通过打开两个会话在数据库开发环境中测试此类事物。我自己用两个终端窗口。

您可以从学习在事务,隔离级别,提交和回滚方面考虑数据库而不是在读取和写入方面受益。