1

我们一直在使用带有 .net 连接器的 C# 和 mysql,但是在单独提交时,有时它无法全部提交。所以我们现在转向这个支持分布式事务的工具http://www.devart.com/dotconnect/mysql/ 。一切正常,只是我们不太确定如何放置多个连接。方法 1 是将每个连接嵌套到另一个中。方法2是分开的。我们应该关闭连接或由 transScope.Complete() 处理的位置;和 transScope.Dispose();

方法一。

using (TransactionScope transScope = new TransactionScope())
{
     string myConnStringLocal = "User Id=***;Password=****;Host=" + globalSettings.settingLocalIP + ";Database=" + globalSettings.settingLocalDB;
     using (MySqlConnection connectionLocal = new MySqlConnection(myConnStringLocal))
     {
       connectionLocal.open() 

       string myConnStringCentral = "User Id=***;Password=*****;Host=" + globalSettings.settingCentralIP + ";Database=" + globalSettings.settingCentralDB;
         using (MySqlConnection connectionCentral = new MySqlConnection(myConnStringCentral))
         {
             connectionCentral.Open();
               string myConnStringCentralCopy = "User Id=*****;Password=*****;Host=" + globalSettings.settingCentralCopyIP + ";Database=" + globalSettings.settingCentralCopyDB;
              using (MySqlConnection connectionCentralCopy = new MySqlConnection(myConnStringCentralCopy))
             {
                 connectionCentralCopy.Open();   
             }
         }
     }

     if (rollbackBoolean == 0)
        transScope.Complete();
     else
        transScope.Dispose();
}

方法二

using (TransactionScope transScope = new TransactionScope())
{
     string myConnStringLocal = "User Id=***;Password=****;Host=" + globalSettings.settingLocalIP + ";Database=" + globalSettings.settingLocalDB;
     using (MySqlConnection connectionLocal = new MySqlConnection(myConnStringLocal))
     {
         connectionLocal.open() 
     }

     string myConnStringCentral = "User Id=***;Password=*****;Host=" + globalSettings.settingCentralIP + ";Database=" + globalSettings.settingCentralDB;
    using (MySqlConnection connectionCentral = new MySqlConnection(myConnStringCentral))
    {
       connectionCentral.Open();
    }

    string myConnStringCentralCopy = "User Id=*****;Password=*****;Host=" + globalSettings.settingCentralCopyIP + ";Database=" + globalSettings.settingCentralCopyDB;
    using (MySqlConnection connectionCentralCopy = new MySqlConnection(myConnStringCentralCopy))
    {
        connectionCentralCopy.Open();   
    }

    if (rollbackBoolean == 0)
        transScope.Complete();
    else
        transScope.Dispose();
}
4

1 回答 1

1

两种方法都是正确的。在这两种情况下,TransactionScope 都将与 dotConnect for MySQL 一起使用。以下代码不是必需的:

else
transScope.Dispose();

因为退出using (TransactionScope transScope = new TransactionScope())块时会自动调用 Dispose 方法。

...我经历了这意味着在我的情况下 transactionScope 将在我调用完整的仪式时关闭它...

不,transScope.Complete() 不会关闭连接。如果连接在 TransactionScope 的 using 块内关闭,则连接对象将关闭,但是如果在 transScope.Complete() 之前调用 transScope.Dispose(),则内部连接将保持打开状态以向数据库发送更改称呼。如果为连接对象调用了 Close 或 Dispose 方法,则 transScope.Dispose() 关闭内部连接。如果连接对象未关闭,则 transScope.Dispose() 对连接不执行任何操作。

...我的每个连接中的另一件事是我跟踪 try 和 catch,如果有任何错误,我将 rollbackBoolean 标记为 1,所以它不会完成并且应该回滚整个事务是正确的机制吗?...

如果发生错误,请不要调用 Complete。如果没有调用 Complete 方法,则在执行 Dispose 方法时事务将回滚。

这是一个带有 try/catch 块并在出现错误时回滚事务的示例:

using (TransactionScope transScope = new TransactionScope())
{
   try
   {
      string myConnStringLocal = "User Id=***;Password=****;Host=" + globalSettings.settingLocalIP + ";Database=" + globalSettings.settingLocalDB;
      using (MySqlConnection connectionLocal = new MySqlConnection(myConnStringLocal))
      {
         connectionLocal.Open();
      }

      string myConnStringCentral = "User Id=***;Password=*****;Host=" + globalSettings.settingCentralIP + ";Database=" + globalSettings.settingCentralDB;
      using (MySqlConnection connectionCentral = new MySqlConnection(myConnStringCentral))
      {
         connectionCentral.Open();
      }
      string myConnStringCentralCopy = "User Id=*****;Password=*****;Host=" + globalSettings.settingCentralCopyIP + ";Database=" + globalSettings.settingCentralCopyDB;
      using (MySqlConnection connectionCentralCopy = new MySqlConnection(myConnStringCentralCopy))
      {
         connectionCentralCopy.Open();
      }
      transScope.Complete();
      Console.WriteLine("Transaction is completed");
   }
   catch (Exception)
   {
      Console.WriteLine("Transaction is rolled back");
   }
}
于 2013-07-23T12:17:33.130 回答