我正在使用SQL Server 2012,并且SFML
使用块内有多个SQL连接到同一数据库。但是,如果第一次Update SQL Operation无法产生所需的输出,那么我将跳过对SQL Operation的下一次调用,同时也将省略对TransactionScope
块末尾未调用的TransactionScope.Complete
的调用。
答案 0 :(得分:3)
您所需的大多数信息都在这里Completing a transaction scope
中列出。当您的应用程序完成它要在其中完成的所有工作时, 交易,您应该只调用一次Complete方法来通知 交易经理认为可以接受 交易。最好将完成呼叫设为 using块中的最后一条语句。
无法调用此方法会中止交易,因为 事务管理器将此解释为系统故障或等效 在事务范围内引发的异常。然而, 调用此方法并不能保证交易会 承诺。这只是一种通知交易经理的方法 你的状态。调用Complete方法后,您将无法再 通过使用Current属性访问环境交易,并且 尝试这样做将导致引发异常。
答案 1 :(得分:2)
未能成功完成交易将导致交易中止,这就是呼叫transaction.complete();
将会发生的事情是,事务管理器会将其解释为系统故障并抛出异常(对我来说是一次,不好),但这是一个很大的 然而 ,它不能保证事务将被提交,因此您也必须调用commit。
例如:
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection connection1 = new SqlConnection(connectString1))
{
// Opening the connection automatically enlists it in the
// TransactionScope as a lightweight transaction.
connection1.Open();
// Create the SqlCommand object and execute the first command.
SqlCommand command1 = new SqlCommand(commandText1, connection1);
returnValue = command1.ExecuteNonQuery();
writer.WriteLine("Rows to be affected by command1: {0}", returnValue);
// If you get here, this means that command1 succeeded. By nesting
// the using block for connection2 inside that of connection1, you
// conserve server and network resources as connection2 is opened
// only when there is a chance that the transaction can commit.
using (SqlConnection connection2 = new SqlConnection(connectString2))
{
// The transaction is escalated to a full distributed
// transaction when connection2 is opened.
connection2.Open();
// Execute the second command in the second database.
returnValue = 0;
SqlCommand command2 = new SqlCommand(commandText2, connection2);
returnValue = command2.ExecuteNonQuery();
writer.WriteLine("Rows to be affected by command2: {0}", returnValue);
}
}
// The Complete method commits the transaction. If an exception has been thrown,
// Complete is not called and the transaction is rolled back.
scope.Complete();
}
提交将在using块的末尾进行,也就是说,如果TransactionScope
对象最初创建了作品。否则,将在每次调用commit
行时进行提交。