首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多连接情况下的NHibernate查询死锁

多连接情况下的NHibernate查询死锁
EN

Stack Overflow用户
提问于 2013-03-28 09:43:28
回答 1查看 3.2K关注 0票数 1

我有下一笔交易:

代码语言:javascript
代码运行次数:0
运行
复制
  Desc d = new Desc();
  d.Descr = "new";

  _sess.Transaction.Begin();

  _sess.SaveOrUpdate(d);

  var desc = _sess.CreateCriteria(typeof(Desc)).List<Desc>();

  _sess.Transaction.Commit();

此事务执行下一个查询:

代码语言:javascript
代码运行次数:0
运行
复制
BEGIN TRANSACTION

INSERT

SELECT 

COMMIT TRANSACTION

当我在两个进程中执行这段代码时,我会出现死锁,因为

1过程

执行插入和锁定键

2过程

执行插入和锁定键

进程希望执行选择并在超时状态下传递2进程要执行选择并在超时状态下传递。

结果:死锁

BD: 2008 R2

2个问题:

  1. 如何设置事务中包含的所有表的更新锁?
  2. 如果我使用这个代码: Desc d=新的Desc();d.Descr = " new "; _sess.Transaction.Begin(IsolationLevel.Serializable); _sess.SaveOrUpdate(d); var desc = _sess.CreateCriteria(typeof(Desc)).List(); _sess.Transaction.Commit();

什么都没变。

IsolationLevel.Serializable是做什么的?

更新:

我要跟上:

代码语言:javascript
代码运行次数:0
运行
复制
USE Test

BEGIN TRANSACTION

SELECT TOP 1 Id FROM [Desc] (UPDLOCK)

INSERT INTO [Desc] (Descr) VALUES ('33333')

SELECT * FROM [Desc] 

COMMIT TRANSACTION

如何使用help NHibernate执行以下操作:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT TOP 1 Id FROM [Desc] (UPDLOCK)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-28 10:46:04

我会将事务隔离水平更改为快照。这避免了读取数据时的锁,允许更多的并发性,特别是在只读事务中没有死锁。

死锁的原因如下:插入不要相互冲突。他们锁定新插入的行。但是,查询被锁定,因为它试图从另一个事务中读取新插入的行。因此,您将得到两个查询,它们都在等待另一个事务完成,这是一个死锁。对于隔离级别快照,查询根本不关心未提交的行。而不是等待锁被释放,它只“看到”已提交的行。这避免了查询中的死锁。

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

https://stackoverflow.com/questions/15678519

复制
相关文章

相似问题

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