【发布时间】:2019-08-21 06:43:36
【问题描述】:
在 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 的情况下,但在其他类型的异常情况下它将不起作用。有人也可以澄清这一点吗?
【问题讨论】:
标签: c# postgresql npgsql sqltransaction