SQLTransaction.Commit() 是如何工作的?
How does SQLTransaction.Commit() work?
前几天研究了一下SqlTransaction
,知道了SqlTransaction.Commit()
的用途——应该是"commit the database transaction." - MSDN。
但是它是如何工作的?
例如:我写了一段代码是这样的:
using (SqlTransaction tran = connection.BeginTransaction())
{
try
{
using (SqlCommand cmd = connection.CreateCommand())
{
cmd.CommandText = msg.command;
cmd.Transaction = tran;
cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
// if all of above have any exception, that's mean my transaction is
// failure and my database has no change.
return false;
}
tran.Commit();
// if all of above have no problems, that's mean my transaction is successful
return true;
connection.Dispose();
}
在这种情况下,SQL服务器在另一台计算机上。
我猜:commit 方法有两个周期,周期 1:当我实现 tran.Commit()
时,编译器将向 SQL 服务器发送信号并与 SQL 服务器通信:"I'm ok, please help me commit (change) data",然后SQL 服务器将执行编译器的请求。第二阶段:当SQL服务器完全执行编译器的请求时,执行结果将return给我们的编译器。当我们的编译器收到执行结果时,我们的编译器将继续编译下一个命令行("return true")。
但是如果在第二阶段,连接断开,执行结果不会传回我们的编译器。在这种情况下,我们的交易成功与否?数据是否保存在 SQL 服务器中?
附加问题:我对 SQLTransaction.Commit() 两个周期的预测是否正确?
谢谢!
try
{
using (var conn = new SqlConnection(/* connection string or whatever */))
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
using (var cmd = conn.CreateCommand())
{
cmd.Transaction = trans;
/* setup command type, text */
/* execute command */
}
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
/* log exception and the fact that rollback succeeded */
}
}
}
}
catch (Exception ex)
{
/* log or whatever */
}
并阅读这篇文章
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.commit(v=vs.110).aspx
前几天研究了一下SqlTransaction
,知道了SqlTransaction.Commit()
的用途——应该是"commit the database transaction." - MSDN。
但是它是如何工作的?
例如:我写了一段代码是这样的:
using (SqlTransaction tran = connection.BeginTransaction())
{
try
{
using (SqlCommand cmd = connection.CreateCommand())
{
cmd.CommandText = msg.command;
cmd.Transaction = tran;
cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
// if all of above have any exception, that's mean my transaction is
// failure and my database has no change.
return false;
}
tran.Commit();
// if all of above have no problems, that's mean my transaction is successful
return true;
connection.Dispose();
}
在这种情况下,SQL服务器在另一台计算机上。
我猜:commit 方法有两个周期,周期 1:当我实现 tran.Commit()
时,编译器将向 SQL 服务器发送信号并与 SQL 服务器通信:"I'm ok, please help me commit (change) data",然后SQL 服务器将执行编译器的请求。第二阶段:当SQL服务器完全执行编译器的请求时,执行结果将return给我们的编译器。当我们的编译器收到执行结果时,我们的编译器将继续编译下一个命令行("return true")。
但是如果在第二阶段,连接断开,执行结果不会传回我们的编译器。在这种情况下,我们的交易成功与否?数据是否保存在 SQL 服务器中?
附加问题:我对 SQLTransaction.Commit() 两个周期的预测是否正确?
谢谢!
try
{
using (var conn = new SqlConnection(/* connection string or whatever */))
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
using (var cmd = conn.CreateCommand())
{
cmd.Transaction = trans;
/* setup command type, text */
/* execute command */
}
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
/* log exception and the fact that rollback succeeded */
}
}
}
}
catch (Exception ex)
{
/* log or whatever */
}
并阅读这篇文章 https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.commit(v=vs.110).aspx