Npgsql如何处理失败的事务?

时间:2019-03-30 14:30:23

标签: c# postgresql npgsql sqltransaction

在ASP.NET应用程序(C#)中,我们使用Postgres作为后端,使用Npgsql作为数据提供者。几天前,我们在数据丢失方面遇到了严重的问题。我调查了代码,发现了这样的代码:

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

有人坚持认为Npgsql会自行处理异常,并会在事务期间出现错误的情况下自动回滚事务。

我认为这是相当乐观的,应该将代码包装在try and catch块中并显式调用事务回滚:

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

那是错吗?

此外,事务回滚将始终有效吗?我在某处读到它仅在引发Postgres异常时才起作用,例如在sql格式不正确的情况下,但在其他类型的异常情况下则不起作用。有人也可以澄清这一点吗?

2 个答案:

答案 0 :(得分:0)

如果发生错误,PostgreSQL将自动中止事务,但不会回滚。

仅当您完成交易

  1. 断开连接

  2. COMMITROLLBACK结束交易(在两种情况下都会回滚)

在错误和事务结束之间的连接上发送的所有语句将被忽略。

是的,您应该使用try / catch块并回滚。

ROLLBACK始终会完全撤消当前事务,无论是否有错误。

答案 1 :(得分:0)

另一种方式可能是:

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

    tx.Commit();
}

处置未提交的事务会导致回滚。资源被释放了!