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函數後纔會提交所有內容?我應該用另一種方法嗎?
- 這是正確的嗎?我的方法是完全徹底錯誤而愚蠢的嗎?
- 有什麼缺點?特別是關於性能。
謝謝。