2012年9月5日 星期三

JDBC 的 Auto-Commit

參考資料:
1、Transactions
2、does Connection commit on close()?
3、JDBC Transaction Example
4、MySQL: InnoDB or MyISAM?

有個小任務是幫忙檢查為什麼在測試時,用我們自己的資料庫連線的 API 要開啟 TRANSACTION 模式
但就算設定了 auto-commit = false 還是會自動 commit
懷疑可能的原因....
1、我們的 API 用的是 executeUpdate() 去執行 INSERT、UPDATE 和 DELETE?(網路上的範例比較多都是呼叫 execute())
2、使用了 TOMCAT 的 JDBC connection pool?

第一點因為 Java 官方的 API 文件並沒有明確指出用 executeUpdate() 就不能用 TRANSACTION
因此應該不會是那個問題~後來主要是在搜尋第二點。
第二點的部份,可以參考 TOMCAT 的文件中有關 BasicDataSource 的描述
不過就算我在 resource 裡面宣告了關閉 Auto-Commit
程式碼運作中印出的 BasicDataSource 的 defaultAutoCommit() 跟 Connection 的 getAutoCommit()
結果都顯示是 false,但程式運作結束後還是會自動 commit....
接著找找找,突然想到一件很重要的事,也就是 [4] 描述的問題 XD
最後找到不能關閉 Auto-Commit 的原因是:因為我們測試的資料表是用 MYISAM 儲存的!如果換成 InnoDB 就好了~囧"

事實證明:程式碼沒有錯,一切純粹是耍笨使然....。

沒有留言: