1. 程式人生 > >多執行緒共享MySQL連線時,使用事務的危險!

多執行緒共享MySQL連線時,使用事務的危險!

在多執行緒程式中,多個執行緒共享一個MySQL連線是很常見的!如今MySQL(我使用的是MySQL 5.0.51a)只要選擇BDB或者InnoDB建表(二者區別:BDB支援頁級鎖定,InnoDB支援行級鎖定),即具備事務處理能力!然而,在多執行緒共享一個MySQL連線時,使用事務卻存在的諸多危險,分析如下!
假設有兩個執行緒Thread A, Thread B共享一個MySQL連線,兩個執行緒分別有如下的執行語句:
情形一:
Thread A:
START TRANSACTION; //開始執行事務
EXECUTE SQL STATEMENT 1;
EXECUTE SQL STATEMENT 2;
ROLLBACK; //回滾事務

Thread B:
EXECUTE SQL STATEMENT 3;

如果Thread B中的SQL STATEMENT 3比Thread A的ROLLBACK先執行,則Thread B的SQL STATEMENT 3將被回滾,而這顯然不是我們需要的!

情形二:
Thread A:
START TRANSACTION; //開始事務
EXECUTE SQL STATEMENT 1;
EXECUTE SQL STATEMENT 2;
COMMIT/ROLLBACK; //提交/回滾事務

Thread B:
COMMIT;

如果Thread B中的COMMIT動作發生在Thread A的SQL STATEMENT 1與SQL STATEMENT 2之間,則使事務失效,同樣不是我們想要的!

當然還有更復雜的,比如多個執行緒都在進行事務,我就不分析了!

因此,在多執行緒共享MySQL連線時,使用事務是非常危險的,建議避免使用!如果涉及到MySQL的事務,一個執行緒建立一個MySQL連線妥當些。如果你覺得這樣比較奢侈,資料庫連線池是個可以考慮的方案!