如果进程意外终止,作为 SqlTransaction 或 TransactionScope 基础的事务是否会回滚?
Does the transaction underlying a SqlTransaction or a TransactionScope get rolled back if a process terminates unexpectedly?
我正在编写一个应用程序来更新单独但相关的数据库表中的数据。我想在我的代码中的事务中执行更新查询。我知道有两种可能的方法:
- 使用 System.Data.SqlClient.SqlTransaction 将每个更新包装在一个事务中。
- 使用 System.Transactions.TransactionScope 将单独的更新操作包装在一个事务中。
我的问题是:如果进程在中间终止,那么这些模型中的任何一个都会导致事务被回滚吗?也就是说,如果有人真的强行终止了进程?例如,如果我有使用第一个模型的代码,并且进程在两个命令之间终止,事务会回滚吗?
try
{
using (var conn = new SqlConnection(connectionString))
{
using (var tran = conn.BeginTransaction("MyTran"))
{
using (var firstCommand = new SqlCommand(firstQuery, conn))
{
firstCommand.ExecuteNonQuery();
}
//PROCESS IS TERMINATED HERE.
using (var secondCommand = new SqlCommand(secondQuery, conn))
{
secondCommand.ExecuteNonQuery();
}
tran.Commit();
}
}
}
catch (Exception)
{
//do whatever.
}
或者如果我有以下使用第二个模型的代码,并且在两个方法调用之间进程终止,事务会被回滚吗?
try
{
using (var scope = new TransactionScope())
{
MyFirstUpdate();
//PROCESS IS TERMINATED HERE.
MySecondUpdate();
scope.Complete();
}
}
catch (Exception)
{
//do whatever.
}
我无法在 MSDN 或其他地方找到任何信息来说明这两种情况下的结果。
如果未提交事务,则会回滚。终止进程会阻止应用 COMMIT
,因为 TransactionScope.Complete
从未被调用,并终止连接,这将导致回滚。
如果我们谈论突然终止进程,"rollback" 逻辑的 none 有机会 运行 并且不会向服务器发送任何消息。这不同于一般的异常处理,其中 finally
块通常会确保回滚发生。
SQL 服务器的行为是对连接应用超时 - 如果连接在超时之前未发送保持活动消息,则它被认为已死并在 SQL 服务器端。如果有事务未决,则在关联连接关闭时回滚。
我正在编写一个应用程序来更新单独但相关的数据库表中的数据。我想在我的代码中的事务中执行更新查询。我知道有两种可能的方法:
- 使用 System.Data.SqlClient.SqlTransaction 将每个更新包装在一个事务中。
- 使用 System.Transactions.TransactionScope 将单独的更新操作包装在一个事务中。
我的问题是:如果进程在中间终止,那么这些模型中的任何一个都会导致事务被回滚吗?也就是说,如果有人真的强行终止了进程?例如,如果我有使用第一个模型的代码,并且进程在两个命令之间终止,事务会回滚吗?
try
{
using (var conn = new SqlConnection(connectionString))
{
using (var tran = conn.BeginTransaction("MyTran"))
{
using (var firstCommand = new SqlCommand(firstQuery, conn))
{
firstCommand.ExecuteNonQuery();
}
//PROCESS IS TERMINATED HERE.
using (var secondCommand = new SqlCommand(secondQuery, conn))
{
secondCommand.ExecuteNonQuery();
}
tran.Commit();
}
}
}
catch (Exception)
{
//do whatever.
}
或者如果我有以下使用第二个模型的代码,并且在两个方法调用之间进程终止,事务会被回滚吗?
try
{
using (var scope = new TransactionScope())
{
MyFirstUpdate();
//PROCESS IS TERMINATED HERE.
MySecondUpdate();
scope.Complete();
}
}
catch (Exception)
{
//do whatever.
}
我无法在 MSDN 或其他地方找到任何信息来说明这两种情况下的结果。
如果未提交事务,则会回滚。终止进程会阻止应用 COMMIT
,因为 TransactionScope.Complete
从未被调用,并终止连接,这将导致回滚。
如果我们谈论突然终止进程,"rollback" 逻辑的 none 有机会 运行 并且不会向服务器发送任何消息。这不同于一般的异常处理,其中 finally
块通常会确保回滚发生。
SQL 服务器的行为是对连接应用超时 - 如果连接在超时之前未发送保持活动消息,则它被认为已死并在 SQL 服务器端。如果有事务未决,则在关联连接关闭时回滚。