gpt4 book ai didi

c# - 如何避免慢速查询造成的死锁

转载 作者:行者123 更新时间:2023-11-30 17:16:13 25 4
gpt4 key购买 nike

我有一个偶尔会导致数据库死锁的 WCF 服务。我的服务允许您向委员会提交申请,还允许您再次加载它们,因为委员会可以更新它们。每个应用程序都有许多与之关联的文档。

所以如果我的服务上发生了一组这样的事件

1) Application #1 is submitted
2) A document is uploaded for application #1
3) Application #1 is loaded
4) Part 2 above finishes

第 3 部分出现死锁。我认为原因是第 2 部分中的文档需要一段时间才能从 WCF 服务提交到 SQL 服务器,并且在此期间它会锁定表。

因此,如果我们从数据库应用程序 #1 加载相关文档,我们就会遇到麻烦。

我正在使用 Entity Framework 。我该如何解决这个问题?我真正想做的是在这种情况下加载完全提交的文档,而不是遇到被锁定的表或任何其他情况。

顺便说一句,这是我遇到的具体错误,

Message: Transaction (Process ID 93) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

更新:我收到了一些意见,我可以更改操作顺序。我实际上不能这样做,因为第 2 部分和第 3 部分来自对 WCF 服务的不同调用。因此,由服务的用户来订购操作。你说“请他们改变它”,但这也不是那么简单。操作的顺序实际上取决于最终用户恰好在正确的时刻“刷新”了他们的浏览器。

更新#2:我需要一些关于如何重现此问题的建议。我已经编写了一个测试应用程序,上面的第 2 部分确实阻止了第 3 部分中的操作,但对我来说,结果是操作 3 只是阻塞,直到操作 2 完成,然后操作 3 完成。

这意味着第 3 部分需要 1 分 50 秒,而不是通常的 3 秒。任何想法为什么它会阻止我,而不是造成僵局?当我使用测试服务器时,它是否与该服务器上的总体数据库流量有关,或者某些数据库设置是否会影响它?

最佳答案

通常有几种方法可以避免死锁(SQL Server 和其他数据库):

1) 仅在事务结束时调用saveChanges(),以一起执行所有查询。

2)改变执行数据库更新的顺序,先执行所有读取(SELECT),最后执行所有更新。

3) 将交易中不会修改的数据从交易中读出。

4) 如果应用程序逻辑允许,将事务的隔离级别更改为 SERIALIZABLE(性能差)或 SNAPSHOT 或其他没有锁定的中间级别,如 READ UNCOMMITTED。

5) 使用 lock(lock_object) 创建同步代码块,避免两个线程并行执行相同的事务或执行两个锁定自己的不同事务。

关于c# - 如何避免慢速查询造成的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7381988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com