1. 程式人生 > >ibatis中SqlMapClient事務處理

ibatis中SqlMapClient事務處理

        ibatis中SqlMapClient事務 sqlMapClient.startTransaction(); 開始事務sqlMapClient.commitTransaction(); 提交事務sqlMapClient.endTransaction(); 結束事務,操作失敗的時候,整個事務就會在endTransaction時回滾。

       新版的ibatis中,不再有rollbackTransaction方法,只能選擇endTransaction代替。如果程式碼沒有顯式的呼叫SqlMapClient.startTransaction()方法,則ibatis會將當前的資料庫操作視為自動提交模式(AutoCommit=true),不過,值得注意的是,這裡的所謂“自動判定”,實際上ibatis並沒有去檢查當前是否已經有事務開啟。

    實際上,在執行update語句時,sqlMap會檢查當前的Session是否已經關聯了某個資料庫連線,如果沒有,則取一個數據庫連線,將其AutoCommit屬性設為true,然後執行update 操作,執行完之後又將這個連線釋放。這樣,上面兩次update 操作實際上先後獲取了兩個資料庫連線,而不是我們通常所認為的兩次update 操作都基於同一個JDBC Connection。這點在開發時需特別注意。

        對於多條SQL 組合而成的一個JDBC 事務操作而言,必須使用startTransaction、commitTransaction和endTransaction操作以實現整體事務的原子性。

        注意!事務不能巢狀。在呼叫commit或end方法之前,從同一執行緒多次呼叫startTransaction將引起丟擲例外。換句話說,對於每個SqlMap例項,每個執行緒最多隻能開啟一個事務。