请问WCF做分布式事务要不要配置MSDTC? RRS feed

  • 问题

  • 代码类似如下:要在2个数据库(不同主机)里执行事务,如果插入记录不成功 就全部ROLLBACK,成功才COMMIT,请问要不要配置MSDTC?



    // This function takes arguments for 2 connection strings and commands to create a transaction
    // involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the
    // transaction is rolled back. To test this code, you can connect to two different databases
    // on the same server by altering the connection string, or to another 3rd party RDBMS by
    // altering the code in the connection2 code block.
    static public int CreateTransactionScope(
        string connectString1, string connectString2,
        string commandText1, string commandText2)
        // Initialize the return value to zero and create a StringWriter to display results.
        int returnValue = 0;
        System.IO.StringWriter writer = new System.IO.StringWriter();

        // 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))
                    // Opening the connection automatically enlists it in the
                    // TransactionScope as a lightweight transaction.

                    // 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.

                            // 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.

        // The returnValue is greater than 0 if the transaction committed.
        if (returnValue > 0)
            writer.WriteLine("Transaction was committed.");
            // You could write additional business logic here, for example, you can notify the caller
            // by throwing a TransactionAbortedException, or logging the failure.
            writer.WriteLine("Transaction rolled back.");

        // Display messages.

        return returnValue;

    2013年7月26日 5:08


  • 我已经找到答案,答案就是如果不是用域,就必须打开MSDTC,在组件服务那里配置,具体配置要百度GOGOLE
    • 已标记为答案 ken yup 2013年7月29日 11:13
    2013年7月29日 11:13