2016-02-02 20 views
0

我想問一個問題。我一直在試圖找到一些有關多連接交易的信息,但我一直沒能找到任何好的信息來源。具有多個連接的交易(MySql,C#)

現在爲我想要做的。我有一些代碼,看起來像這樣:

using (var Connection1 = m_Db.CreateConnection()) 
using (var Connection2 = m_Db.CreateConnection()) 
{ 
    Connection1.DoRead(..., (IDataReader Reader) => 
    { 
     // Do stuff 
     Connection2.DoWrite(...); 
     Connection2.DoRead(..., (IDataReader Reader) => 
     { 
      // Do more stuff 
      using (var Connection3 = m_Db.CreateConnection()) 
      { 
       Connection3.DoWrite(...); 
       Connection3.Commit(); // Is this even right? 
      } 
     }); 
    }); 

    Connection1.DoRead(..., (IDataReader) => 
    { 
     // Do yet more stuff 
    }); 
    Connection1.Commit(); 
    Connection2.Commit(); 
} 

每個創建連接創建使用的MySqlConnection一個新的事務::調用BeginTransaction。 CreateConnection方法創建一個包裝MySqlConnection的Connection對象。 DoRead函數執行一些SQL,並在完成時處置IDataReader。

每個連接都會在處置時進行回滾。

現在對於一些注意事項:

  • 我有一臺服務器有多個數據庫。
  • 我正在使用InnoDB數據庫運行MySql服務器。
  • 我正在讀取和寫入這些數據庫。
  • 出於性能方面的原因,不要搞亂數據庫,我正在使用事務。
  • 該代碼是(至少,現在)完全串行。沒有併發線程。所有插入和查詢都以串行方式完成。
  • 我使用多個連接到數據庫,因爲在另一個讀取正在進行時(基本上讀取器對象尚未處理),不允許讀取或寫入。
  • 我基本上希望每個連接都能看到所有更改。例如,在連接3做了一些寫操作之後,連接1應該看到這些。但是數據應該在事務中,而不是寫入數據庫(還)。

現在,我的問題:

  • 工作的呢?只有在調用最後一個Commit函數後纔會提交所有內容?我應該用另一種方法嗎?
  • 這是正確的嗎?我的方法是完全徹底錯誤而愚蠢的嗎?
  • 有什麼缺點?特別是關於性能。

謝謝。

回答

0

Welp,似乎沒人知道。但沒關係。

現在,我只使用一種連接方法,將所有結果讀入List>,然後關閉閱讀器,從而避免了必須使用多個連接的問題。

可能會出現性能問題?也許吧,但總比不得不面對不確定性和僵局。