Я использую TransactionScope
, так что я могу быть уверен, что либо все мои данные удалены & сохранено, либо все откат.C# 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
, тогда у меня не будет возможности отката.
Каков выход из этого? Есть ли другой способ ускорить удаление чем-то вроде Bulk Deletes?
- Добавлена
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.
план выполнения запроса: -
Используйте хранимые процедуры. К сожалению, транзакции применимы только для коротких операций. – buffjape
Подготовьте временную таблицу за пределами транзакции со всеми значениями первичного ключа для удаляемых строк, запустите транзакцию и выполните команду delete 1, которая удалит их все. Однако, если выполняемые вами заявления относятся к разным таблицам и что это может быть невозможно. –
Когда вы говорите «слишком много времени», что ** точно ** вы имеете в виду? Мы говорим миллисекунды? секунд? минут? часы? И «более 30», сколько в данном сценарии? 35? 350? 3500? 3,5 миллиона? –