我是C#程序员。我想清除这个复杂的概念。
如果有2个数据库:A和B。假设我要在两个数据库中都插入记录,但首先要在A中然后在B中插入记录。请说如果在db B中插入时发生异常。情况是,如果B崩溃,则与db A的事务也应回滚。我需要做什么?
我知道我可以将SqlTransaction对象与SqlConnectionString类一起使用。我可以为此提供一些代码吗?
像这样使用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(); }