【问题标题】:Deadlock in Entity Framework实体框架中的死锁
【发布时间】:2017-12-06 16:13:59
【问题描述】:

我有一个几乎同时接收几个请求的 Web 服务。

如果发生这种情况,两个请求的事务就会死锁,我必须回滚重新运行它们。

        using (var context = new DbContext())
        using (var dbContextTransaction = context.Database.BeginTransaction(IsolationLevel.Serializable))
        {
                var subscription = context.Subscriptions.FirstOrDefault(x => x.Provider == provider);
                if (subscription == null)
                {
                   */Insert*/
                }
                else
                {
                   /*Update*/
                }
                context.SaveInTransaction(null);
                dbContextTransaction.Commit();
                }

据我了解,这两个请求都输入了事务并阅读了订阅表。当它们准备好提交时,它们就死锁了,因为它们无法在另一个事务(IsolationLevel.Serializable)读取的数据范围内插入值。

如果我不使 TransactionLevel 可序列化,则其中一个请求无法满足提供者列的唯一约束并被回滚。

我应该怎么做才能防止死锁?

【问题讨论】:

标签: c# sql-server entity-framework transactions


【解决方案1】:

如果我不使 TransactionLevel 可序列化,则其中一个请求无法满足提供者列的唯一约束并被回滚。

你可以:

1) 处理 PK 违规/死锁并继续更新现有行。请注意,您应该使用 READ COMMITTED 并处理 PK 违规,因为您知道失败的会话可以继续更新。使用 SERIALIZABLE,您可以在 INSERT 或 UPDATE 上遇到死锁。

2) 使用带有锁定提示的原始 SQL 使一个会话等待另一个会话。

正确的锁定提示是 (UPDLOCK,SERIALIZABLE)。如果您使用 MERGE,则锁定提示仍然是必需的。见https://blogs.msdn.microsoft.com/dbrowne/2013/02/25/why-is-tsql-merge-failing-with-a-primary-key-violation-isnt-it-atomic/

3) 在事务开始时调用sp_getapplock 以确保只有一个会话拥有锁。请注意,只有在您的应用程序只有一个实例时,CLR 锁才会起作用。对于客户端/服务器应用程序或网络场,CLR 锁将不起作用。

您可以向 DbContext 添加一个方法,例如:

public void GetAppLock(string lockName)
{
    this.Database.ExecuteSqlCommand("exec sp_getapplock @name, 'exclusive'", new System.Data.SqlClient.SqlParameter("@name",lockName));
}

【讨论】:

  • SERIALIZABLE 还不够吗?为什么还需要更新锁?
  • SELECT 需要 UPDLOCK,否则 SERIALIZABLE 将使用 S 锁。对于 MERGE(或 UPDATE)SERIALIZABLE 就足够了,因为它们在读取时已经使用 U 锁,您只​​需要为空键范围添加范围锁定。
  • 啊,我虽然你的意思是专门合并需要提示
  • 我猜想“在事务开始时”调用sp_getapplock 意味着:在BeginTransaction 语句之后之后(否则它不会被限定为该会话)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多