2016-06-07 55 views
1

我有一個MySql數據庫,其中有九個表。我需要從C#中的異步作業動態上傳到其中的六個。但是,爲了加速上傳,其中四個使用MySqlBulkLoader,而另外兩個使用手動上傳方法。爲了支持併發性並防止數據庫中的錯誤,我需要同時上傳它們。爲此,我決定使用交易來確保「全部或全部」類型上傳。MySqlBulkLoader與MySqlCommand在交易

潛藏的問題:MySqlCommand類允許其Transaction屬性中通過MySqlTransaction類的事務支持,並MySqlBulkLoader允許原子上傳(我用INNODB發動機,見mysql - Can MySqlBulkLoader be used with a transaction?)。但是,MySqlBulkLoader創建它自己的原子上傳事務,而另一個單獨的事務將用於MySqlCommand的我將執行。這不支持序列化,並且如果一個批量加載器完成它的工作,仍然可能導致錯誤,但應用程序在另一個完成之前關閉。如果交易可以嵌套,這將是可以解決的;但是,它們不能:php - Mysql transactions within transactions

我的問題是:有沒有在C#連接器的任何方式,讓MySqlBulkLoader與一個MySqlTransaction相關聯,如果沒有,是否有什麼辦法可以自動回滾由以前MySqlBulkLoader所做出的改變。我查看了Connector.NET 6.9提供的API,看起來這可能是通過MySqlConnection.BeginTransaction()方法可能的,但Werner Wolf中的一個問題暗示了其他問題。

編輯

我通過Saravanan發現this question。但是,我不認爲這個問題與MySqlBulkLoaderMySqlCommand混合的因素有關。

回答

1

原來的問題問:

有沒有在C#連接器的任何方式,讓 MySqlBulkLoader與一個 MySqlTransaction
爲此相關聯,似乎沒有。只是將兩個事務捆綁在一起也不起作用,因爲它不支持序列化(因爲我認爲它不會)。但是,替代問題詢問:
是否有任何方法自動回滾以前的 MySqlBulkLoader所做的更改。
而且,似乎還沒有簡單的方法來回滾更改。當然,我可以檢查前後的表格狀態,刪除之前不存在的條目;但是,這個解決方案並不是最優的。但是,解決方案可能會以問題的形式出現。對原始問題的回答假設無法將單獨的交易與 MySqlBulkLoader相關聯;但沒有具體說明我們可以自己創建一個(又名,擴展 MySqlBulkLoader類以包含 Transaction實例參數)。這似乎是問題的解決方案,以及問題 Werner Wolf問題的解決方案。

但是,這根本不是解決方案。由於MySqlBulkLoader是SQL語法LOAD DATA INFILE的簡單包裝,因此它的行爲與SQL查詢相同。從MySQL Reference Manual,我們收到我們的回答:

本節中列出的語句(及其任何同義詞)隱式地結束當前會話中的任何活動事務,就像在執行語句之前執行了COMMIT一樣。
該網頁部分中較低的聲明是 LOAD DATA INFILE。這是對我們問題的真正答案:不可能將 MySqlBulkLoaderMySqlTransaction聯繫起來,至少可以達到我們打算的效果。然而,如上所述,問題的解決方案可能是檢查每個表的主鍵的索引,鎖定表,保存其位置,並在上傳失敗後執行手動「回滾」。