在一个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异常(例如语法错误)时才有效,但在其他类型的异常情况下不会起作用。有人可以澄清一下这一点吗?