У меня есть такой код:
await using var db = new NpgsqlConnection(ConnectionString);
using var tx = new TransactionScope(TransactionScopeOption.Required, options, TransactionScopeAsyncFlowOption.Enabled);
// 1 step: SELECT * FROM table WHERE ID = 1
// 2 step: UPDATE table SET status = "initiated"
if (updatedRows > 0)
{
tx.Complete();
}
Переменная options
содержит IsolationLevel = IsolationLevel.RepeatableRead
. Также код, обернутый в Polly WaitAndRetryAsync
, который соответственно обернут в FallbackAsync
для обработки одновременного обновления статуса в той же строке - просто повторите (SELECT
, а затем UPDATE
) такие операции, как Postgres Документы говорят на PostgresException
с SqlCode = 40001
. Все отлично работает, за исключением мелочей: в журнале Postgres я заметил много строк, таких как:
LOG: unexpected EOF on client connection with an open transaction
LOG: unexpected EOF on client connection with an open transaction
...
С одной точки зрения, транзакция была сброшена из-за PostgresException
, которую я пытался обработать. Но если это так, значит ли это, что TransactionScope
с Postgres соединением не имеет какого-либо механизма отката c, который мягко закрывает соединение без неожиданных падений? Или у меня есть какие-либо недопонимания в этой ситуации?
UPD Я думаю, что причиной этой проблемы были некоторые другие соединения, которые я создал для запроса (из других бизнес-уровней), которых у меня нет исправлено (переделано) еще. Поэтому я думаю, что вопрос, вероятно, может быть закрыт, но я все еще собираюсь найти информацию о TransactionScope
в отношении Postgres.