我正在使用 NHibernate作为数据访问层和SQL Server compact开发 ac# 桌面应用程序。该应用程序使用多个线程来执行数据的选择和更新。
一般来说,它工作正常,但有时会出现死锁情况。
15:28:16,750 55 WARN:System.Data.SqlServerCe.SqlCeLockTimeoutException (0x80004005):超时..... [会话 id = 28,线程 id = 14576,进程 id = 12960,表名 = PatientOrder,冲突类型 = x锁定(x 块),资源 = PAG(idx):1035]
如果两个事务尝试更新相同的行,我可以理解死锁问题。但是在这种情况下,两个事务都在不同的行上工作。死锁似乎是由索引 ( )上的页面锁定引起的。Resource = PAG (idx): 1035
所以我的问题是:可以做些什么来防止这些死锁?
我已经研究了以下选项:
禁用索引的页面锁定。这对于“完整”SQL 服务器是可能的,但精简版似乎不支持
配置休眠以生成
with(rowlock)
sql 语句,这将(希望)防止问题尝试使用
session.lock(...)
以对所有事务执行相同顺序的资源访问。然而,这似乎没有帮助,因为死锁事务无论如何都在不同的行上工作序列化所有数据库事务,以便一次只有一个处于活动状态。这确实有效,但会对性能产生重大影响。