3

我正在使用 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(...)以对所有事务执行相同顺序的资源访问。然而,这似乎没有帮助,因为死锁事务无论如何都在不同的行上工作

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

4

1 回答 1

0

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

于 2013-07-17T21:52:29.177 回答