【问题标题】:C# TransactionScope - Locking records IssueC# TransactionScope - 锁定记录问题
【发布时间】:2017-01-05 20:04:07
【问题描述】:

我正在使用TransactionScope,这样我可以确保我的所有数据都已删除并保存,或者所有内容都已回滚。

但这里的问题是我的记录更多,删除记录花费了太多时间,另一方面,记录被其他用户锁定。

这是代码:-

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

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

删除操作的foreach 循环花费了太多时间并导致记录锁定。如果我从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'

不同 Entry_date 的员工 ID 不同。

查询的执行计划:-

【问题讨论】:

  • 使用存储过程。不幸的是,事务只适用于短期操作。
  • 在事务之外准备一个临时表,其中包含要删除的行的所有主键值,启动事务并发出 1 个删除语句将它们全部删除。但是,如果您正在执行的语句都针对不同的表,那么这可能是不可能的。
  • @buffjape 存储过程如何更快——如果他们能做同样的工作?
  • 为什么要一一删除?您可以在一个查询中运行删除吗?
  • 这里的任何人都可以做到,老实说我宁愿不这样做,因为您已经说过使用该解决方案并不可行。但是,如果其他人想要这样做(即使是你,那也是 100% 可以的),那就去吧。

标签: c# model-view-controller entity-framework-6


【解决方案1】:

TransactionScope 默认为Serializable 隔离级别。这是最安全的级别,但也是并发最少的级别。您通常希望显式设置更常见的隔离级别:

using (var scope = new TransactionScope(
             TransactionScopeOption.Required,
             new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted  }))
{ 
   ...
}

【讨论】:

  • 感谢您的回答,我会试试这个东西。
【解决方案2】:

您是否设置了正确的索引? 我建议您为您的删除查询之一提取执行计划并检查成本最高。

如果可能的话,添加一个索引来解决这个问题!

【讨论】:

  • 我已经有关于 EmployeeId 和 Entry_Date 的索引,而且如果我直接在 SQL Server 中删除这个查询,它也需要时间。这里的问题是锁定和回滚。
  • @Anup 是的,我知道无论您在哪里执行查询都需要时间,但是如果运气好的话,您可以通过查看执行计划并找出导致它如此缓慢的原因来使其运行得更快。 .
  • 感谢您的建议,我刚刚成功运行了我的 1 个删除查询并附上了执行计划的图像,请指导我,因为我不太了解索引。!
  • @Anup 如果您右键单击执行计划并单击Missing index details...,这将为您提供一个索引,该索引将降低大约 95% 的成本/时间,但它会使更新和插入速度变慢并占用更多磁盘空间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多