前几天,我研究过SqlTransaction
,我知道SqlTransaction.Commit()
的目的 - 它应该“提交数据库事务”。 - 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 Server位于另一台计算机上。
我猜:commit方法有两个句点,第1期:当我实现tran.Commit()
时,编译器会发信号通知SQL Server并与SQL Server交谈:“我没问题,请帮我提交(更改)数据“,然后SQL Server将实现编译器的请求。第2阶段:当SQL Server完全实现编译器的请求时,实现结果将返回给我们的编译器。当我们的编译器收到实现结果时,我们的编译器将继续编译下一个命令行(“return true”)。
但是如果在第二个时期,连接断开,实现结果不会传回我们的编译器。在这种情况下,我们的交易是否成功?数据是否仍然存在于SQL Server中?
补充问题:我对SQLTransaction.Commit()的两个时期的预测是否正确?
谢谢!
答案 0 :(得分:3)
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