数据库中的回滚和调度?

时间:2015-04-18 20:17:45

标签: sql database oracle database-design rollback

如果我们在以下调度中使用Timestamp Ordering进行并发控制:

enter image description here

  

我的TA说T2,T3,T5是Run和T4,T1是Rollback。我认为这是错误的。   任何专家都可以帮助我们? (即,在这个时间表中哪个事务回滚和哪一个完成?

更新:完成所有工作后的所有交易,提交。

5 个答案:

答案 0 :(得分:4)

总的来说,默认情况下,读者不会阻止作者和作者不阻止读者。

写入一行的第一个会话持有一个锁,直到发出提交或回滚为止,其他会话将被该锁写入阻止,但仍然可以读取它。

基于那个

  • T1可写(y)因为没有其他会话写入y,然后在y
  • 上保持锁定
  • T2从不写,所以永远不会被阻止。
  • T3尝试在T1之后写入(y),因此被阻止。
  • T4写入(x),而T5读取的x不影响该值。
  • T5尝试写y被T1持有的锁阻止。

但这并不是导致回滚的原因,并且假设没有发布显式提交或回滚。

答案 1 :(得分:1)

关键是"读者不会阻止作者和作者不阻止读者",如@DavidAldridge所述。 那么交易3将等待transacion 1,然后交易5将等待交易1和3,他们可以等待很长一段时间,等待n秒或不等待,这取决于数据库的参数集。在Oracle中它是如何工作的。

伙计们,因为这是一个竞赛问题,我将假设逻辑并贯彻执行。

关于解释并试图坚持给出的解释很多。这里给出的信息是:用于并发控制的TIMESTAMP ORDERING。然后他给我们:T1,T2到T5。然后我假设T1先来,然后是T2,依此类推,因为事务总是被序列化:一个接一个,基于他们的TIMESTAMP。我确实认为,为了让人们假设“T5读(x)'是第一个交易只是因为文本的处理方式是添加不在那里的信息。它说TIMESTAMP ORDERING并给你T1,T2 ...逻辑说一个接一个。没有事务会回滚,他们只是等待,不仅仅是因为一个事务可能持有一个锁,而另一个事务也试图获得锁将自动回滚。在Oracle事务中,只有在发生死锁时才会自动回滚。由于情况似乎并非如此,因此没有回滚。

答案 2 :(得分:1)

我认为你在这里与oracle标签混淆了。我想你想要基于问题第一行的Timestamp based concurrency control算法,这是计算机科学理论中并发控制的一种非常常见的算法。

Easier to understand link

此外,您对回滚的使用不正确,因为事务未回滚但已重新启动。 (这也发生在oracle中)

算法的工作原理如下 -

  

每当事务开始时,都会给它一个时间戳。我们就是这样   可以判断应该应用交易的顺序   因此,给定两个影响同一对象的事务,   具有较早时间戳的事务将被应用   在另一个之前。但是,如果实际上是错误的交易   先呈现,它已中止,必须重新启动

基于此,让我们给我们的交易一个时间戳,如t = 1,2,3,4,5 ......

  • T5从t = 1开始。
  • T2从t = 2开始。
  • T1从t = 3开始。
  • T3从t = 4开始。
  • T4从t = 5
  • 开始
  • T5在t = 6时有另一个操作,但它的时间戳仍为t = 1,因为时间戳是根据事务开始时间分配的。

继续前进,

  

数据库中的每个对象都有一个读取时间戳,每当读取对象的数据时都会更新,而写入时间戳会在对象的数据发生更改时更新。

在开始时,X和Y的读写时间戳都为0。

以下列方式处理读取请求:

If TS < W-ts(x) then
    reject read request and abort corresponding transaction
    else
    execute transaction
    Set R-ts(x) to max{R-ts(x), TS}

写入请求按以下方式处理:

  If TS < R-ts(x) or TS < W-ts(x) then
   reject write request
   else
   execute transaction
   Set W-ts(x) to TS. 

让我们浏览一下我们的对象并应用这些规则。

  1. T5开始并读取X. TS 5 = 1. WTS(X)= 0.正常。设置RTS(x)= 1。
  2. T2开始并读取Y.TS 2 = 2. WTS(Y)= 0.正常。设置RTS(Y)= 2。
  3. T1开始并写入Y.TS 1 = 3.RTS(Y)= 1.WTS(Y)= 0。写完成。设置WTS(Y)= 3。
  4. T3开始并写入Y.TS 3 = 4.RTS(Y)= 1.WTS(Y)= 3。写完成。设置WTS(Y)= 4。
  5. T4开始并写入X.TS 4 = 5. RTS(x)= 1. WTS(x)= 0.写完成。设置WTS(x)= 5.
  6. T5写(y)。 TS 5 = 1.RTS(y)= 1.WTS(y)= 4.TS 5 <1。 WTS(y)。使用新时间戳回滚并重新启动事务。 (可能t = 7)
  7. 所以这给了我们一个与你的TA不同的答案,只有T5被回滚并重新启动。

    我希望得到纠正,并了解为什么T4和T1被中止并重新启动。

答案 3 :(得分:1)

这不是用我自己的话来解释它,而是一个有用的MSDN链接,它向您显示ROLLBACK TRANSACTION及其工作原理。

https://msdn.microsoft.com/en-us/library/ms181299.aspx?f=255&MSPPError=-2147217396

任何问题都可以随意问我。

答案 4 :(得分:1)

关于锁定,它取决于数据库上设置的隔离级别。

Microsoft on Isolation Levels:

事务隔离级别控制: 是否在读取数据时执行锁定以及请求的锁定类型。 读锁的持有时间。 是否读取操作引用由另一个事务修改的行: 阻止直到行上的独占锁定被释放。 检索语句或事务启动时存在的行的已提交版本。 读取未提交的数据修改。

来源:https://technet.microsoft.com/en-us/library/ms189122(v=sql.105).aspx

E.g。如果您的隔离级别设置为REPEATABLE READ:

&#34;指定语句无法读取已被修改但尚未由其他事务提交的数据,并且没有其他事务可以修改当前事务已读取的数据,直到当前事务为止完成&#34;

来源:https://technet.microsoft.com/en-us/library/ms173763(v=sql.105).aspx