SQL Server中的悲观并发 - 无法释放应用程序锁

时间:2015-07-20 09:39:01

标签: sql asp.net sql-server asp.net-mvc

我有一个悲观并发的应用程序锁,并在Asp.Net Mvc中生成代码。

_ContextB.Database.ExecuteSqlCommand("Execute Sp_GetAppLock 'Code Generation', 'Exclusive'");
_ContextB.Entities.Add(entity);
_ContextB.SaveChanges();
// Generate code in a Sql Server Trigger(On Insert)

错误:

_ContextB.Database.ExecuteSqlCommand("Execute Sp_ReleaseAppLock 'Code Generation'");
  

无法释放应用程序锁(数据库主体:'public',资源:'代码生成'),因为它当前未被保留。

我使用多上下文。

有什么问题?

感谢。

1 个答案:

答案 0 :(得分:2)

默认情况下,EF为每个操作使用新连接。您的applock永远不会正常工作,因为在该声明之后关闭了连接。

最好的解决办法是:

  1. 明确打开连接
  2. 在使用中包装上下文以确保连接已关闭
  3. 打开显式事务,以便控制事务边界
  4. 考虑使用锁表而不是Sp_GetAppLock。使用EF更容易。使表有一行并增加一个虚拟列以引起写入。这确保了排他性并观察了事务语义。