Будет ли TransactionScope обнаруживать ошибку асинхронного метода или передаваться так, как никогда не было? - PullRequest
0 голосов
/ 28 сентября 2018

Я везде искал в Интернете ответ на проблему, с которой столкнулся на работе, но безрезультатно.Таким образом, у нас есть TransactionScope, и в операторе using, который объявляет эту область, у нас есть несколько вызовов методов async / await для написания запросов к одной базе данных, например:

using(var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)()
{
     await repository.InsertQuery1Async(item);
     await repository.InsertQuery2Async(item);
     await repository.InsertQuery3Async(item);

     ts.Complete();
}

Каждый из этихЗапросы представляют вставку в отдельную таблицу.Проблема заключается в том, что InsertQuery2Async, по-видимому, завершился ошибкой в ​​единичном случае, судя по сообщенной ошибке, из-за которой я обнаружил, что в базовую таблицу этого запроса не было вставлено ни одной записи.Я не смог воспроизвести эту ошибку, но я сбит с толку, как это могло произойти.

Если есть ошибка в любом из этих методов запроса, если TransactionScope не обнаружит это и откатит всю транзакциюназад?

Из того, как это выглядит из этого изолированного случая, видно, что Query1 и Query3 успешно зафиксированы, потому что я проверил базовые таблицы базы данных для параметра, переданного этим методам, и успешно нашел записи.Но записи отсутствуют для таблицы, связанной с Query2.Я что-то упускаю из-за того, как объекты Task и их исключения работают с TransactionScope?В чем может быть проблема здесь?

...