Linq - 批量删除时如何防止锁定

时间:2017-01-03 04:30:41

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

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

以下是代码: -

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'

1 个答案:

答案 0 :(得分:0)

如果您需要删除块中的员工,您可以使用此

拆分员工列表
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;
        }

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