2013-07-22 28 views
1

我们一直使用C#和mysql与.net连接器,但个别提交有时无法提交所有内容。所以我们现在转向支持分布式事务的这个工具http://www.devart.com/dotconnect/mysql/。所有的工作都很好,只是我们不太清楚如何放置多重连接。方法1是将每个连接嵌套到另一个中。方法2是分开的。我们应该关闭连接或由transScope.Complete()处理;和transScope.Dispose();Devart Connectory使用事务范围的正确方法Mysql

方法1.

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(); 
} 

方法2

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(); 
} 
+0

你为什么要开到同一数据库3个连接?连接没有被'TransactionScope'关闭。你不必调用'trasnsactionScope.Dispose()' - 'using'语句为你做。 – YK1

+0

分布式事务是一种开销,如果您想扩展您的应用程序,将会是一个很大的障碍。尽可能避免它。 – YK1

+0

@ YK1 no是三个不同的dbs 1.globalSettings.settingLocalDB 2.globalSettings.settingCentralDB和3.globalSettings.settingCentralCopyDB。我知道是乏味的,但我没有选择,因为我现场得到更新数据,否则就会出现混乱的观点。那么哪种方法使用1或2?如何在transactionscope之后关闭数据库连接? – new14

回答

1

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

else 
transScope.Dispose(); 

因为离开using (TransactionScope transScope = new TransactionScope())块时Dispose方法被自动调用。

...我通过它去在我的情况意味着TransactionScope的将关闭它,当我称之为完整的仪式...

没有,transScope.Complete()不关闭连接。如果连接在TransactionScope的使用块内关闭,则连接对象将被关闭,但如果内部连接前面有transScope.Complete(),则调用transScope.Dispose()时,内部连接将保持打开状态,以便向数据库发送更改。呼叫。如果为连接对象调用Close或Dispose方法,transScope.Dispose()将关闭内部连接。如果连接对象未关闭,则transScope.Dispose()对连接不起作用。

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

如果发生错误,请不要致电完成。如果未调用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"); 
    } 
} 
+0

所以我想你是来自公司本身。问题是,在我的第一个connectionLocal中,我也执行一些select来检查值是否低于某个范围,然后我希望整个事情都是回滚,这就是为什么我跟踪rollbackBoolean值。因此,在正常情况下,我可以假设一旦它从我们的TransactionScop中关闭了所有的内部连接?我很困惑这里“如果连接对象没有关闭,transScope.Dispose()对连接没有任何作用。”所以我必须要求关闭吗? – new14

+0

transScope.Complete();和transScope.Dispose();不要关闭连接,你必须自己照顾它。 – Devart

+0

@我可以根据你的例子关闭连接说我有试过并且能在最后关闭所有3分贝的连接就行了吗? – new14