Spring與Hibernate整合事務管理的理解
在談Spring事務管理之前我們想一下在我們不用Spring的時候,在Hibernate中我們是怎么進行數(shù)據(jù)操作的。在Hibernate中我們每次進行一個操作的的時候我們都是要先開啟事務,然后進行數(shù)據(jù)操作,然后提交事務,關閉事務,我們這樣做的原因是因為Hibernate默認的事務自動提交是false,他是需要我們人為的手動提交事務,假如你不想每次都手動提交事務的話,你可以在hibernate.cfg.xml我文件中把它設置為事務自動提交:
xml代碼
<property name="defaultAutoCommit"> <value>false</value> </property>
縱然我們把它的事務提交方式設置為自動,它可以進行數(shù)據(jù)操作,但是這樣并不滿足我們實際的業(yè)務需求,因為有時候在我保存一個數(shù)據(jù)之后,我希望他能繼續(xù)保存另一條數(shù)據(jù),我希望在保存完兩條或者多條之后一起進行事務提交,這樣即使出錯,我們可以回滾,取保數(shù)據(jù)的一致性,要么都成功要么都失敗,這時候我們就不能每保存完一條數(shù)據(jù)之后事務就自動提交,因為這樣它們不在同一個事務當中,我們不能保證數(shù)據(jù)的一致行。所以這時候我們就需要手動的來配置我們的事務,這就需要用到Spring為Hibernate提供的事務管理機制,Spring提供的事務管理可以分為兩類:編程式的和聲明式的,編程式,其實就是在代碼里面來控制,像Hibernate操作數(shù)據(jù)一樣,開啟事務,提交事務,這種方式有一定的局限性,所以我們一般是用聲明式來配置我們的事務。
聲明式事務配置主要分以下幾步:
1、聲明式事務配置
(1) 配置事務管理器;
(2)事務的傳播特性;
(3)那些類那些方法使用事務。
<!-- 配置事務管理器 指定其作用的sessionFactory把事務交給Spring去處理 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <!-- 配置事務的傳播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 那些類的哪些方法參與事務 --> <aop:config> <aop:pointcut id="allServiceMethod" expression="execution(* com.coe.service.*.*(..))"/> <aop:advisor pointcut-ref="allServiceMethod" advice-ref="txAdvice"/> </aop:config>
我們在配置事務的時候,我們一般是把事務邊界設置到service層,也就是你的業(yè)務邏輯層,因為我們很多時候都是在我們的業(yè)務邏輯層來完成我們一些列的數(shù)據(jù)操作,如果放到Dao數(shù)據(jù)層,其粒度太小了。另外,如果我們把事務配置在業(yè)務邏輯層的話,對我們的二級緩存也是有好處的,這個大家以后實際操作的時候會發(fā)現(xiàn)。
2、編寫業(yè)務邏輯方法
這時候我們就可以在我們業(yè)務邏輯層用HibernateTemplate里面提供的數(shù)據(jù)操作方法來編寫我們的業(yè)務邏輯方法了,當然我們的方法必須要是以我們事務配置里面配置的一樣,用save,delete,update,get做我們的方法的開頭。需要注意的是,默認情況下運行期異常才會回滾(包括繼承了RuntimeException子類),普通異常是不會滾的。
最后我們順便總結一下事務的幾種傳播特性:
1. PROPAGATION_REQUIRED: 如果存在一個事務,則支持當前事務。如果沒有事務則開啟;
2. PROPAGATION_SUPPORTS: 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執(zhí)行;
3. PROPAGATION_MANDATORY: 如果已經(jīng)存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常;
4. PROPAGATION_REQUIRES_NEW: 總是開啟一個新的事務。如果一個事務已經(jīng)存在,則將這個存在的事務掛起;
5. PROPAGATION_NOT_SUPPORTED: 總是非事務地執(zhí)行,并掛起任何存在的事務;
6. PROPAGATION_NEVER: 總是非事務地執(zhí)行,如果存在一個活動事務,則拋出異常;
7. PROPAGATION_NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執(zhí)行。
通過本文希望能幫助大家對Spring 和Hibernate 的整合事務管理的理解,謝謝大家對本站的支持!
相關文章
idea2023創(chuàng)建JavaWeb教程之右鍵沒有Servlet的問題解決
最近在寫一個javaweb項目,但是在IDEA中創(chuàng)建好項目后,在搭建結構的時候創(chuàng)建servlet文件去沒有選項,所以這里給大家總結下,這篇文章主要給大家介紹了關于idea2023創(chuàng)建JavaWeb教程之右鍵沒有Servlet問題的解決方法,需要的朋友可以參考下2023-10-10spring,mybatis事務管理配置與@Transactional注解使用詳解
這篇文章主要介紹了spring,mybatis事務管理配置與@Transactional注解使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07詳解SpringBoot中的統(tǒng)一結果返回與統(tǒng)一異常處理
這篇文章主要將通過詳細的討論和實例演示來幫助你更好地理解和應用Spring Boot中的統(tǒng)一結果返回和統(tǒng)一異常處理,感興趣的小伙伴可以了解下2024-03-03