【发布时间】: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