【问题标题】:Linq - How to prevent locks when bulk deleteLinq - 批量删除时如何防止锁定
【发布时间】:2017-01-03 04:30:41
【问题描述】:

在我的代码逻辑中,首先我删除带有多个查询的大记录,然后进行批量插入。

这是代码:-

using (var scope = new TransactionScope())
{
      using (var ctx = new ApplicationDbContext(schemaName))
      {
         // Delete
         foreach (var item in queries)
         {
             // Delete queries - more than 30 - optimized already
             ctx.Database.ExecuteSqlCommand(item);                   
         }

         // Bulk Insert
         BulkInsert(ConnectionString, "Entry", "Entry", bulkTOEntry);
         BulkInsert(ConnectionString, "WrongEntry", "WrongEntry", bulkWrongEntry);
      }
      scope.Complete();          
}

这里的问题在于删除部分。删除查询大约需要 10 分钟。这会导致记录被锁定,从而阻止其他用户获取或操作记录。

我的代码在 TransactionScope 中,好像删除时有任何错误,然后它将回滚整个事务。

我试图通过存储过程删除块中的记录,但这在这里没有帮助,因为由于 TransactionScope,记录仍然存在锁定。

如何防止记录被锁定?

删除查询示例:-

DELETE FROM [Entry] 
WHERE CompanyId = 1 
  AND EmployeeId IN (3, 4, 6, 7, 14, 17, 20, 21, 22,....100 more) 
  AND Entry_Date = '2016-12-01' 
  AND Entry_Method = 'I'

【问题讨论】:

  • 你是说如果你删除TransactionScope,你的代码运行得更快吗?您在 for 循环中运行的 SQL 命令是什么?
  • @FrankFajardo 代码在有或没有TransactionScope 的情况下运行相似。问题是在删除过程中锁定记录。
  • @Eldho 谢谢,我会检查的
  • 我问的是执行时间,而不是结果。但是在看到您针对同一问题的其他 SO 问题后,我同意 @Eldho 关于使用 EF 扩展的观点。

标签: linq asp.net-mvc-4 model-view-controller


【解决方案1】:

如果您需要删除分块的员工,您可以使用此拆分员工列表

public static List<IEnumerable<T>> Partition<T>(this IEnumerable<T> source, int length)
        {
            var count = source.Count();
            var numberOfPartitions = count / length + ( count % length > 0 ? 1 : 0);

            List<IEnumerable<T>> result= new List<IEnumerable<T>>();
            for (int i = 0; i < numberOfPartitions; i++)
            {
                result.Add(source.Skip(length*i).Take(length));
            }

            return result;
        }

您可以使用此方法将列表拆分为小块并一次删除一个块,以便其他用户可以使用块之间的表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多