Почему откат транзакции SQL Server влияет на все инструкции, за исключением конкретного обновления конкретной таблицы?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему откат транзакции SQL Server влияет на все инструкции, за исключением конкретного обновления конкретной таблицы?

Сообщение Anonymous »

У меня возникла проблема с отменой транзакции на SQL-сервере. Это происходит каждый раз в определенном методе нашего .NET-кода, который я упрощу следующим образом:

Код: Выделить всё

private ItemEx Update(ItemSavable savable, bool changedByWorkflow, Dal.Entities.Data.User currentUser)
{
var item = itemRepository.GetById(savable.Id);
var oldItem = item.Clone();

using (var transaction = new PpmTransaction())
{
try
{
// Statement 1 - Database UPDATE
item = itemRepository.SaveAndReturnEntity(savable);

// Statement 2 - Database INSERT
eventService.Trigger(new ItemStatusChangeEvent(statusChangedUser, item, oldItem));

// Statement 3 - Database UPDATE of several rows + INSERT
itemModifiedRepository.Add(item.Id, item.StatusId, DateTime.UtcNow, statusChangedUser.Id)
}
catch
{
itemRepository.DeleteCacheItem(item.Id);
throw;
}

transaction.Commit();
}

return item;
}
Проблема заключается в следующем. Иногда время ожидания последнего оператора (itemModifiedRepository.Add) приводит к возникновению исключения. Затем транзакцию следует откатить (из-за того, как в C# работает блок using). Однако, похоже, это происходит лишь частично: хотя оператор 1 (обновление базы данных, которое происходит в itemRepository.SaveAndReturnEntity) успешно отменяется, INSERT базы данных (оператор 2) и UPDATE базы данных (первая часть оператора 3) не возвращаются.
Поскольку наши клиенты заметили это странное поведение по последствиям утверждения 2, в качестве первоначального «грязного исправления» я поменял местами положения Утверждения 2 и Утверждения 3.
  • Теперь первый оператор правильно отменён. Второй оператор не отменяется, а последний оператор вообще не выполняется из-за выброшенного исключения.
Нам интересно, как могло произойти такое странное поведение происходить. Мы подумали, что, возможно, транзакция была частично откатана, но на SQL-сервере это невозможно. Похоже, что транзакция умерла после первого оператора, и код не знал об этом, отправив остальные операторы за пределы транзакции. Кто-нибудь когда-нибудь сталкивался с чем-то подобным?

Подробнее здесь: https://stackoverflow.com/questions/787 ... nts-except
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»