首页 > 解决方案 > 删除在 SQL 中创建死锁

问题描述

我有两张桌子说 T1 和 T2。T1 在 T2 中有一个引用,如下所示:

表:T1

|Col1|
|v1  |
|v2  |
|v3  |

表:T2

|Id|Col1|Col2|
|1 |v1  |v2  |
|2 |v2  |v1  |
|3 |v1  |v3  |
|4 |v3  |v1  |

所以我们有一个 T1 的主键作为 T2 Col1 和 Col2 的外键。现在,每当对 T1 发出删除请求时(比如我想删除 v1),首先需要从 T2 中删除其引用的行(在这种情况下 T2 中的 Id 1,2,3,4 ),然后 T1 中的记录将删除。

现在,当我们尝试使用实体框架删除它时,它陷入了死锁并失败了。

关于如何解决这个问题的任何建议?

更新的 EF 代码:

 using (_dbContext as IDisposable)
                {

                        var t1= _dbContext.T1
                        .Include(t1 => t1.Table3)
                        .FirstOrDefault(x => x.Id == Col1);

                         var lstT2 = _dbContext.T2
                        .Where(x => x.Col1 == value ||
                                    x.Col2== value).ToList();

                    using (var transaction = _dbContext.BeginTransaction())
                    {
                        try
                        {
                            foreach (var t2 in lstT2)
                            {
                                _dbContext.T2.Remove(t2);
                                _dbContext.SaveChanges();
                            }
                            _dbContext.T1.Remove(t1);

                            _dbContext.SaveChanges();
                            transaction.Commit();

                        }

                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            NLogger.Log(LogLevel.Error, ex.Message);
                            throw ex;
                        }
                    }

标签: sqlsql-serverentity-frameworkentity-framework-6database-deadlocks

解决方案


推荐阅读