gpt4 book ai didi

.net - 由索引上的页锁引起的sql server compact死锁

转载 作者:行者123 更新时间:2023-12-05 01:22:26 26 4
gpt4 key购买 nike

我正在开发一个使用 NHibernate 作为数据访问层和 SQL Server compact 的 c# 桌面应用程序。该应用程序使用多个线程来执行数据的选择和更新。

一般情况下它工作正常,但有时会出现死锁情况。

15:28:16,750 55 WARN : System.Data.SqlServerCe.SqlCeLockTimeoutException (0x80004005): Timeout ..... [ Session id = 28,Thread id = 14576,Process id = 12960,Table name = PatientOrder,Conflict type = x lock (x blocks),Resource = PAG (idx): 1035 ]

如果两个事务尝试更新相同的行,我可以理解死锁问题。但是,在这种情况下,两个事务都在不同的行 上工作。死锁似乎是由索引上的页锁引起的(Resource = PAG (idx): 1035)。

所以我的问题是:可以做些什么来防止这些死锁?

我已经研究了以下选项:

  • 为索引禁用页锁。这对于“完整”SQL 服务器是可能的,但似乎不受压缩版的支持

  • 配置 hibernate 以生成 with(rowlock) 用于(希望)防止问题的 sql 语句

  • 尝试使用 session.lock(...) 对所有事务以相同的顺序强制执行资源访问。然而,这似乎没有帮助,因为死锁事务无论如何都在不同的行上工作

  • 序列化所有数据库事务,以便一次只有一个处于事件状态。这确实有效,但会严重影响性能。

最佳答案

@Wolfgang 你是如何管理你的 ISession 的? ISession 不是线程安全的,如果您使用单个实例并在线程之间共享,这应该是您的问题。如果您使用的是 IoC,请验证 ISession 的范围,为每个线程更改它。

关于.net - 由索引上的页锁引起的sql server compact死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11689259/

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