DeadLock DbContext并发事务

时间:2012-06-05 11:44:24

标签: c# sql-server-2008 entity-framework-4.1

enter image description here

嗨,请参阅上图中的死锁图部分。我有两个事务更新同一个表,其中一个是长事务,更新该表(同一行)5次但另一个事务只更新该表一次是一个两个数据库命中的小事务。从死锁图中逻辑上是真的,这个事务在不同的行上都有X锁,并试图获得U锁。我不明白为什么较短的事务获得X锁虽然它还没有激发更新查询(因为它是导致死锁的更新查询,这意味着它还没有被解雇)。任何帮助都将非常有用。 1)我正在使用隔离级读取提交 2)我无法理解第二个/第一个事务如何获得X锁定,而另一个事务已经在某个行上获得它。我在更新查询时读取,首先应用U锁定,然后升级到该特定更新行的X锁定。现在,当一个事务具有X锁定时,另一个事务如何在表扫描期间具有U锁定(以确定要更新的行),它无法读取其他事务具有X锁定的行.3)事务更新一个不同同一个表的行。数据库级别的任何可能的解决方案,而不更改隔离级别。

1 个答案:

答案 0 :(得分:1)

  

我无法理解第二个/第一个事务如何获得X锁定   而另一个交易已经在某个行上了。

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

  

我在更新查询中看到,首先应用了U锁,然后是   升级到特定更新行的X锁。

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