第十三章 事務並發處理
Hibernate是JDBC的輕量級封裝,本身並不具備事務管理能力,在事務管理層,Hibernate將其委托給底層的JDBC或者JTA,以實現事務的管理和調度。
Hibernate的默認事務處理機製基於JDBCTransaction,也可以通過配置文件設定采用JTA作為事務管理實現。
14.1基於JDBC的事務管理
這裏要注意的是,在sessionFactory.openSession()中,Hibernate會初始化數據庫連接,與此同時,將其AutoCommit設為關閉狀態,這就是說,從SessionFactory獲得session,其自動提交屬性就已經被關閉了,下麵的代碼不會對事務性數據庫產生任何效果。
session=sessionFactory.openSession(); session.save(user); session.close();
如果要使得代碼真正作用到數據庫,必須顯示的調用Transaction指令
session=sessionFactory.openSession(); Transactiontx = session.beginTransaction(); session.save(user); tx.commit(); session.close();
14.2基於JTA的事務管理
JTA,即JavaTransaction API,譯為Java事務API。
JTA允許應用程序執行分布式事務處理——在兩個或多個網絡計算機資源上訪問並且更新數據。JDBC驅動程序的JTA支持極大地增強了數據訪問能力。
JTA提供了跨Session的事務管理能力,這是與JDBCTransaction最大的差異。
JDBC事務由Connection管理,也就是說,事務管理實際上是在JDBCConnection中實現,事務周期限於Connection的生命周期之內,對於基於JDBCTransaction的Hibernate事務管理機製,事務管理在Session所依托的JDBCConnection中實現,事務周期限於Session的生命周期。
JTA事務管理由JTA容器實現,JTA容器對當前加入事務的眾多Connection進行調度,實現其事務性要求,JTA的事務周期可橫跨多個JDBCConnection生命周期,同樣,對基於JTA事務的Hibernate,JTA事務橫跨多個Session。需要注意的是,參與JTA事務的Connection需避免對事務管理進行幹涉,如果采用JTATransaction,就不應該再調用Hibernate的Transaction功能。
JTA一般用於跨數據庫的事務,由應用JTA容器實現。可在tomcat中配置jta。一般JTA整合Spring使用更加方便。
Hibernate的JTA配置
<property name="hibernate.transaction.factory_class"> org.hibernate.transaction.JTATransactionFactory </property>
最後更新:2017-04-03 18:52:12