0

在此处输入图像描述

嗨,请参阅上图中的死锁图部分。我有两个事务更新同一个表,其中一个是更新该表(同一行)5 次的长事务,但另一个事务只更新该表一次并且很小两个数据库命中的事务。从死锁图中,这两个事务在不同的行上都有 X 锁并试图获得 U 锁,这在逻辑上是正确的。我不明白为什么较短的事务虽然还没有触发更新查询但会获得 X 锁(因为它是导致死锁的更新查询,这意味着它还没有被触发)。任何帮助都会非常明显。1)我正在使用隔离级别读取提交 2)我无法理解第二个/第一个事务如何获得 X 锁,而另一个事务已经在某行获得它。

4

1 回答 1

1

我无法理解第二个/第一个事务如何获得 X 锁,而另一个事务已经在某行获得它。

这就是数据库及其性能背后的魔力。锁可以在不同的级别上发布,如果第二个事务不使用表扫描,它可以发布 X 锁而不会与第一个事务冲突。可能没有发生使用索引和表扫描搜索的更新记录,因此您的表中可能存在多个并发 X 锁。

我在更新查询中读到,首先应用 U 锁,然后针对该特定更新行升级到 X 锁。

不,更新应该直接在记录上使用 X 锁。读取要更新的数据的读取查询必须强制 U 锁定(这就是 @Marc 在他的评论中提到的)。如您所知,EF 不支持这一点,因为它不能使用提示。

于 2012-06-05T18:04:02.483 回答