Как Npgsql обрабатывает неудачные транзакции? - PullRequest
3 голосов
/ 30 марта 2019

В приложении ASP.NET (C #) мы используем Postgres в качестве бэкэнда и Npgsql в качестве поставщика данных.Пару дней назад у нас была серьезная проблема с потерей данных.Я исследовал код и нашел код, подобный этому:

    var transaction = connection.BeginTransaction();
    //some crud operation here  
    transaction.Commit()

Кто-то настаивал на том, что Npgsql будет обрабатывать исключение самостоятельно и автоматически откатит транзакцию в случае, если что-то пойдет не так во время транзакций.

На мой взгляд, это довольно оптимистично, и код должен быть заключен в блок try и catch и явно вызвать откат транзакции:

 var transaction = connection.BeginTransaction();
 try
    {
        //some crud operation here        
        transaction.Commit
    }catch(Exception ex)
    {
        transaction.Rollback();
    }

Это неправильно?

Кроме того, будет лиоткат транзакции всегда работает?Я где-то читал, что он будет работать только в том случае, если возникнет исключение Postgres, скажем, в случае некорректного sql, но не будет работать в случае исключений другого типа.Может кто-нибудь прояснить этот момент тоже?

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

другой способ может быть:

using( var tx = connection.BeginTransaction())
{
    .. do som database stuff ..

    tx.Commit();
}

Распоряжение на незафиксированной транзакции приводит к откату. И ресурсы освобождены!

0 голосов
/ 30 марта 2019

PostgreSQL автоматически прервет, но не откатит транзакцию в случае ошибки.

Транзакция будет выполнена, только если вы

  1. отключите

  2. завершить транзакцию с COMMIT или ROLLBACK (откат произойдет в в обоих случаях)

Все выписки, отправленные насвязь между ошибкой и окончанием транзакции будет игнорироваться.

Так что да, вы должны использовать try / catch блок и откат.

A ROLLBACK всегда будетполностью отменить текущую транзакцию, независимо от того, произошла ошибка или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...