在我的代码逻辑中,首先我要删除包含多个查询的大型记录。然后进行批量插入。
以下是代码: -
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'
答案 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;
}
您可以使用此方法将列表拆分为小块并一次删除一个块,以便其他用户可以在块之间使用该表