簡體   English   中英

在未處理的異常之后,使用C#Mysql Connector禁用AutoCommit

[英]Disable AutoCommit using C# Mysql Connector after an unhandled exception

我目前正在使用MySql作為后端數據庫開發一個C#應用程序。

不幸的是我發現了一個無法解釋的有線行為。

我想使用事務來“組合”多個查詢,以確保只執行所有命令或不執行任何命令。

但是,由於我的編碼錯誤,在事務期間發生了未處理的異常。

我對事務的理解是,在這種情況下,事務被回滾。

盡管如此,我發現Mysql似乎默認啟用AutoCommit,並在斷開連接后提交,因為未處理的異常導致崩潰。

所以我嘗試通過執行SET autocommit = 0來禁用它

但這不起作用。

編輯:我使用以下代碼創建了事務:

_transaction = _mysqlConnection.BeginTransaction();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = _mysqlConnection;
cmd.Transaction = _transaction

其他人提到,BEGIN的使用應該可以解決這個問題,但事實並非如此。 在Mysql日志中執行以下查詢:

239 Connect   user@localhost on gssm
239 Query     SHOW VARIABLES
239 Query     SHOW COLLATION
239 Query     SET character_set_results=NULL
239 Init DB   db
239 Query     SET autocommit = 0
239 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
239 Query     BEGIN
239 Query     INSERT INTO TestTable (KeyField, Value) VALUES ('foo', 'bar')

當然我應該修復我的代碼,以便不會發生未處理的異常,但有沒有辦法防止Mysql這樣做?

謝謝!

克里斯

使用實際支持事務的MySql引擎是個好主意... MyISAM沒有,這就是問題所在。 因此,如果想要使用事務確保,您使用正確的引擎(例如InnoDB)。

對不起您的浪費和時間,感謝您的建議。

克里斯

你試過手動啟動會話嗎?

START TRANSACTION;

SET autocommit =0;

祝好運!

您是否在異常處理程序上手動回滾事務?

catch(Exception ex)
{
    try
    {
        trans.Rollback();
    }
    catch(MySqlException mse)
    {
        log.error(mse);
    }
}

您實際上並未在該日志中創建事務,請參閱MySQL事務文檔以獲取更多信息。 BEGIN只是啟動一組復合語句。

如果您正在使用ADO.NET,最簡單的方法是使用正確的提交/回滾語義創建一個新的DbTransaction

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM