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