我有下一笔交易:
Desc d = new Desc();
d.Descr = "new";
_sess.Transaction.Begin();
_sess.SaveOrUpdate(d);
var desc = _sess.CreateCriteria(typeof(Desc)).List<Desc>();
_sess.Transaction.Commit();
此事务执行下一个查询:
BEGIN TRANSACTION
INSERT
SELECT
COMMIT TRANSACTION
当我在两个进程中执行这段代码时,我会出现死锁,因为
1过程
执行插入和锁定键
2过程
执行插入和锁定键
进程希望执行选择并在超时状态下传递2进程要执行选择并在超时状态下传递。
结果:死锁
BD: 2008 R2
2个问题:
什么都没变。
IsolationLevel.Serializable是做什么的?
更新:
我要跟上:
USE Test
BEGIN TRANSACTION
SELECT TOP 1 Id FROM [Desc] (UPDLOCK)
INSERT INTO [Desc] (Descr) VALUES ('33333')
SELECT * FROM [Desc]
COMMIT TRANSACTION
如何使用help NHibernate执行以下操作:
SELECT TOP 1 Id FROM [Desc] (UPDLOCK)
发布于 2013-03-28 02:46:04
我会将事务隔离水平更改为快照。这避免了读取数据时的锁,允许更多的并发性,特别是在只读事务中没有死锁。
死锁的原因如下:插入不要相互冲突。他们锁定新插入的行。但是,查询被锁定,因为它试图从另一个事务中读取新插入的行。因此,您将得到两个查询,它们都在等待另一个事务完成,这是一个死锁。对于隔离级别快照,查询根本不关心未提交的行。而不是等待锁被释放,它只“看到”已提交的行。这避免了查询中的死锁。
https://stackoverflow.com/questions/15678519
复制相似问题