我們這裡只討論hibernate 對事務的支援,注意沒有涉及到spring 跟hibernate 整合這個問題將放到以後再討論。
在hibernate 裡面也定義了乙個介面 transaction public void begin() throws hibernateexception;
public inte***ce transaction
這裡面最重要的有 begin, commit and rollback 幾個方法。
有聊這個介面hibernate 對事務應用的最常見idiom 是 :
session sess = factory.opensession();
transaction tx;
try
catch (exception e)
finally
這個session 的實現類是sessionimpl, 在sessionimpl.begintransaction() 方法中
幾個的思路就是根據 configruation 資訊 獲取到transaction, 然後呼叫transaction.begin() 方法。
hibernate 裡面的transaction 有兩個最常見的實現jtatransaction, jdbctransaction。 根據配置資訊的不一樣, begintransaction得到就是這兩個類得不同例項。 在實現這兩個類得時候, hibernate 還有個這個session需要處理。 這個session裡面managed bean 需要flush, 通常在 這個 commit 方法要先呼叫 manageflush 來強制cache 中的狀態同步到資料庫。
jtatransaction 實現的思路 技術上是begin() 的時候 通過jndi 找到 usertransaction, 這個usertransaction 開始就意味著global transaction 開始了。 同時利用jta 事務的syncronization 機制註冊個 cachesynchronization。 這個 cachesynchronization 會在 jta 事務 開始提交前 和提交後 分別 flush 和 close
jtatransaction 的 commit 方法 差不多是 先 managedflush , 然後 usertransaction.commit
jdbctransaction 的事務的思路呢 begin 時 得到 那個jdbc connection, 修改它的 autocommit 成 false 就意味著 jdbc 事務開始了.
commit 的時候呢 同樣也要先 session flush, 然後找到那個 connection 去 commit(), 完了如果有必要恢復 autocommit 成 true 的話就 reset 回去。
這裡只是簡單介紹hibernate 對事務的處理, 至於spring 對事務的處理在以後的文章中會提到。
spring 對事務的支援
id txmanager class org.springframework.jdbc.datasource.datasourcetransactionmanager name datasource ref c3p0datasource bean bean id c3p0datasource cla...
JDBC對事務的支援
事務要滿足四個條件 acid 原子性 乙個事務,要麼成功,要麼回滾 撤回 一致性 事務開始前的資料要和結束後的資料保持一致。隔離性 乙個事務正在進行,另外的事務要等待。永續性 事務提交後,資料的改變是永久性的。jdbc對dml語言的操作是預設提交的。當有多個dml操作時,我們應該取消自動提交 改為手...
spring對事務支援的三種形式
spring對事務支援的三種形式 1 通過spring配置檔案進行切面配置 class org.springframework.jdbc.datasource.datasourcetransactionmanager 2 通過開始事務程式設計來開啟乙個事務 transactiontemplate t...