2013-07-22 52 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