在这种情况下如何处理sql事务?

我是C#程序员。 我想清除这个复杂的概念。

如果有2个数据库:A和B.假设我想在两个数据库中插入记录但首先在A中然后在B中插入记录。假设在插入db B时发生exception。 情况是,如果B崩溃,还应回滚与db A的事务。 我需要做什么?

我知道我可以将SqlTransaction对象与SqlConnectionString类一起使用。 我可以为此准备一些代码吗?

这里已经问过: 在多个数据库上实现事务 。

keithwarren7的最佳答案:

像这样使用TransactionScope类

using(TransactionScope ts = new TransactionScope()) { //all db code here // if error occurs jump out of the using block and it will dispose and rollback ts.Complete(); } 

如有必要,该类将自动转换为分布式事务。

编辑:向原始答案添加解释

你在MSDN中有一个很好的例子: http : //msdn.microsoft.com/fr-fr/library/system.transactions.transactionscope%28v=vs.80%29.aspx 。

此示例显示如何在一个TransactionScope中使用2个数据库连接。

  // Create the TransactionScope to execute the commands, guaranteeing // that both commands can commit or roll back as a single unit of work. using (TransactionScope scope = new TransactionScope()) { using (SqlConnection connection1 = new SqlConnection(connectString1)) { try { // 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)) try { // 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); } catch (Exception ex) { // Display information that command2 failed. writer.WriteLine("returnValue for command2: {0}", returnValue); writer.WriteLine("Exception Message2: {0}", ex.Message); } } catch (Exception ex) { // Display information that command1 failed. writer.WriteLine("returnValue for command1: {0}", returnValue); writer.WriteLine("Exception Message1: {0}", ex.Message); } } // The Complete method commits the transaction. If an exception has been thrown, // Complete is not called and the transaction is rolled back. scope.Complete(); } 

如果您只想拥有一个连接并且喜欢管理这些内容,那么您可以使用链接服务器并从服务器A调用SP,服务器A可以从服务器B调用SP

🙂