锁定数据库中的事务

时间:2012-08-05 18:04:17

标签: database concurrency

我想知道被另一笔交易阻止的交易会发生什么?

最好通过一个例子说,我有两个交易 - T1和T2以及以下场景:

T1 .............................................. .......... T2

锁定DB对象
阅读Q ................................................ ..Lock Q(T2被阻止)

写Q. 解锁Q

在T1完成后T2是否未被阻止或者它永远丢失了?我以前认为T2被发送到等待队列并等待轮到它。

感谢任何向我澄清这个概念的人:)

1 个答案:

答案 0 :(得分:1)

在这种情况下会发生两件常见的事情:

  1. T2等待直到T1释放锁定。如何实现这取决于数据库软件(以及可能由OS提供的锁定原语)。
  2. T2在尝试锁定Q并发现它已被锁定时被中止。 (例如,针对Oracle,使用UPDATE选项发出的LOCK TABLENOWAIT声明。)
  3. 让T2“永远丢失”将是数据库引擎中的一个错误。

    有关Oracle锁定策略的有趣读物:How Oracle Locks Data。 (整个章节,数据并发和一致性,如果您正在研究这些数据库方面,这很有意思。请注意,这些细节依赖于高度数据库。您在那里阅读的内容不会例如,直接应用于SQL Server,DB2或MySQL。)