Npgsql 如何处理失败的事务?
How does Npgsql handle failed transactions?
在 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 的情况下,但在其他类型的异常的情况下它不会起作用。有人也可以澄清这一点吗?
PostgreSQL 会在出现错误时自动中止但不会回滚事务。
交易只有在您
断开连接
以COMMIT
或ROLLBACK
结束事务(它将在两种情况下回滚)
在错误和事务结束之间的连接上发送的所有语句都将被忽略。
所以是的,你应该使用 try
/ catch
块和回滚。
A ROLLBACK
将始终完全撤消当前事务,无论是否有错误。
另一种方式可能是:
using( var tx = connection.BeginTransaction())
{
.. do som database stuff ..
tx.Commit();
}
处置未提交的事务会导致回滚。并释放资源!
在 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 的情况下,但在其他类型的异常的情况下它不会起作用。有人也可以澄清这一点吗?
PostgreSQL 会在出现错误时自动中止但不会回滚事务。
交易只有在您
断开连接
以
COMMIT
或ROLLBACK
结束事务(它将在两种情况下回滚)
在错误和事务结束之间的连接上发送的所有语句都将被忽略。
所以是的,你应该使用 try
/ catch
块和回滚。
A ROLLBACK
将始终完全撤消当前事务,无论是否有错误。
另一种方式可能是:
using( var tx = connection.BeginTransaction())
{
.. do som database stuff ..
tx.Commit();
}
处置未提交的事务会导致回滚。并释放资源!