首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DeadLock DbContext并发事务

DeadLock DbContext并发事务
EN

Stack Overflow用户
提问于 2012-06-05 19:44:24
回答 1查看 560关注 0票数 0

嗨,请看上图中的死锁图部分。我有两个更新同一个表的事务,其中一个是长事务,更新该表(同一行)5次,但另一个事务只更新该表一次,是两个DB命中的小事务,从死锁图中.Its逻辑为真,这两个事务在不同的行上都有X锁,并试图获得U锁。我不明白为什么较短的事务获取X锁,尽管它还没有触发update查询(因为它是导致死锁的更新查询,这意味着它还没有被触发)。任何帮助都是非常容易接受的。1)我使用的是隔离级别read committed。2)我不能理解为什么第二个/第一个事务可以获得X锁,而另一个事务已经在某些行上获得了它。我在更新查询时读到,当一个事务具有X锁时,第一个U锁被应用,然后被升级为X锁,当一个事务具有X锁时,另一个事务如何具有U锁,因为在表扫描期间(以确定要更新的行),它不能通过其他事务读取具有X锁的行。3)两个事务都更新同一table.Any的一个不同行,而不更改隔离级别。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-06 02:04:02

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

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

我读到,在更新查询时,第一个U锁被应用,然后被升级为X锁,用于特定的更新行。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10896714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档