0

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

最好通过一个示例来处理,假设我有两个事务 - T1 和 T2 以及以下场景:

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

锁定 DB 对象
读取 Q ............................................. .....锁Q(T2被挡)

写Q 解锁Q

那么 T2 是在 T1 完成后解除阻塞还是永远丢失?我曾经认为 T2 被发送到等待队列并在那里等待轮到它。

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

4

1 回答 1

1

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

  1. T2 一直等到 T1 释放锁。这是如何实现的取决于数据库软件(可能还有操作系统提供的锁定原语)。
  2. 当 T2 尝试锁定 Q 并发现它已被锁定时,它会中止。(例如,对于 Oracle,与选项一起发布的UPDATEorLOCK TABLE声明NOWAIT。)

让 T2 “永远丢失”将是数据库引擎中的一个错误。

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

于 2012-08-05T18:14:44.073 回答