1. 程式人生 > >spring、hibernate事務管理的區別及整合方式

spring、hibernate事務管理的區別及整合方式

在談Spring事務管理之前我們想一下在我們不用Spring的時候,在Hibernate中我們是怎麼進行資料操作的。在Hibernate中我們每次進行一個操作的的時候我們都是要先開啟事務,然後進行資料操作,然後提交事務,關閉事務,我們這樣做的原因是因為Hibernate預設的事務自動提交是false,他是需要我們人為的手動提交事務,假如你不想每次都手動提交事務的話,你可以在hibernate.cfg.xml我檔案中把它設定為事務自動提交: <propertyname="hibernate.connection.autocommit">true</property> 當我們Spring對我們的Hibernate進行整合之後,我們的程式碼又出現了什麼變化呢?整合,之後,我們不再是每次都去拿Session進行資料操作了,也不需要每次都開啟事務,提交事務了,我們只需要Spring給我們提供的一個HibernateTemplate,我們直接用這個類裡面給我們提供的資料操作方法就可以操作資料了。我們在也看不到關於事務的程式碼了,那Spring究竟有沒有在他的操作方法裡面封裝事務處理呢?有的人直接HibernateTemplate裡面提供的方法操作資料,成功了,有的人卻又失敗了,這到底是怎麼回事呢? 其實這裡要看我們是怎樣整合我們的 Hibernate和Spring,如果在整合的過程中,我們拋棄了hibernate.cfg.xml檔案,直接在Spring的的配置檔案中進行配置資料來源的話,那你直接用HibernateTemplate裡面提供的方法是可以成功操作資料的,如果你還是用hibernate.cfg.xml來配置資料來源,在Spring的配置檔案中引用hibernate.cfg.xml檔案,那麼你不能成功,這其中的原因就是因為如果你用 hibernate.cfg.xml檔案配置資料來源,就像我們前面說的,Hibernate預設是手動提交事務,而HibernateTemplatel 提供的方法裡面並沒有提供事務提交,而如果你用Spring的配置檔案來配置資料來源,Sping預設是自動提交的,所以就會成功,如果你想把Spring 設定為手動提交你可以在起配置檔案中進行配置: <property name="defaultAutoCommit"> <value>false</value> </property> 縱然我們把它的事務提交方式設定為自動,它可以進行資料操作,但是這樣並不滿足我們實際的業務需求,因為有時候在我儲存一個數據之後,我希望他能繼續儲存另一條資料,我希望在儲存完兩條或者多條之後一起進行事務提交,這樣即使出錯,我們可以回滾,取保資料的一致性,要麼都成功要麼都失敗,這時候我們就不能每儲存完一條資料之後事務就自動提交,因為這樣它們不在同一個事務當中,我們不能保證資料的一致行。所以這時候我們就需要手動的來配置我們的事務,這就需要用到Spring為Hibernate提供的事務管理機制,Spring提供的事務管理可以分為兩類:程式設計式的和宣告式的,程式設計式,其實就是在程式碼裡面來控制,像Hibernate操作資料一樣,開啟事務,提交事務,這種方式有一定的侷限性,所以我們一般是用宣告式來配置我們的事務。 宣告式事務配置主要分以下幾步: 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層,也就是你的業務邏輯層,因為我們很多時候都是在我們的業務邏輯層來完成我們一些列的資料操作,如果放到Dao資料層,其粒度太小了。另外,如果我們把事務配置在業務邏輯層的話,對我們的二級快取也是有好處的,這個大家以後實際操作的時候會發現。 2、編寫業務邏輯方法 這時候我們就可以在我們業務邏輯層用HibernateTemplate裡面提供的資料操作方法來編寫我們的業務邏輯方法了,當然我們的方法必須要是以我們事務配置裡面配置的一樣,用save,delete,update,get做我們的方法的開頭。需要注意的是,預設情況下執行期異常才會回滾(包括繼承了RuntimeException子類),普通異常是不會滾的。 最後我們順便總結一下事務的幾種傳播特性: 1. PROPAGATION_REQUIRED: 如果存在一個事務,則支援當前事務。如果沒有事務則開啟; 2. PROPAGATION_SUPPORTS: 如果存在一個事務,支援當前事務。如果沒有事務,則非事務的執行; 3. PROPAGATION_MANDATORY: 如果已經存在一個事務,支援當前事務。如果沒有一個活動的事務,則丟擲異常; 4. PROPAGATION_REQUIRES_NEW: 總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起; 5. PROPAGATION_NOT_SUPPORTED: 總是非事務地執行,並掛起任何存在的事務; 6. PROPAGATION_NEVER: 總是非事務地執行,如果存在一個活動事務,則丟擲異常; 7. PROPAGATION_NESTED:如果一個活動的事務存在,則執行在一個巢狀的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行。

相關推薦

springhibernate事務管理區別整合方式

在談Spring事務管理之前我們想一下在我們不用Spring的時候,在Hibernate中我們是怎麼進行資料操作的。在Hibernate中我們每次進行一個操作的的時候我們都是要先開啟事務,然後進行資料操作,然後提交事務,關閉事務,我們這樣做的原因是因為Hibernate

spring mvc + hibernate 事務管理 + mysql

一:配置事務:datasource.xml <!-- 配置Hibernate事務管理器 --> <bean id="transactionManager" class="org.springframework.orm.

Java進階學習第二十四天(Spring框架:事務管理SpringHibernate整合

一、事務控制 1、引入 使用者訪問 > Action > Service > Dao 如何保證: 在service中呼叫2次dao,其中一個dao執行失敗,整個操作要回滾 2、事務控制概述 ① 程式設計式事務控制:自己手動控制事務 Jdbc程式

spring整合hibernate事務管理器配置

連結歸納的很詳細。 首先在/WEB-INF/applicationContext.xml新增以下內容:<!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.

Spring+Hibernate整合時關於Hibernate事務管理的問題

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.

8.Spring整合Hibernate_2_聲明式的事務管理(Annotation的方式

之一 為什麽 runtime span nal not 方法 int action 聲明式的事務管理(AOP的主要用途之一) (Annotation的方式)   1.加入annotation.xsd   2.加入txManager bean   3.<tx:annot

Java Struts2SpringHibernate框架jar包下載

-i tex eas nsa 項目 ack slf4 n-2 3.4 一、框架的下載 1、Struts2:http://struts.apache.org/download 2、Spring:http://www.springsource.org/download/co

深入理解spring事務管理機制程式碼實現

Spring的事務管理機制 Spring事務管理高層抽象主要包括3個介面,Spring的事務主要是由他們共同完成的: PlatformTransactionManager:事務管理器—主要用於平臺相關事務的管理 TransactionDefinition: 事務定義資訊(隔

SSH——struts2springhibernate三大框架的純配置式的整合

一、SSH三個框架的知識點: 1、Hibernate框架:    1.1、Hibernate的核心配置檔案: 資料庫資訊、連線池配置、 Hibernate資訊、對映配置(實體類和資料庫表對映關係:使用的是ORM思想)、Hibernate核心配置檔案。

Spring管理 hibernate 事務配置的五種方式

Spring配置檔案中關於事務配置總是由三個組成部分,DataSource、TransactionManager和代理機制這三部分,無論是那種配置方法,一般變化的只是代理機制這塊!   首先我建立了兩個類,一個介面一個實現: Java程式碼&

Spring事務管理配置異常詳解

最近在生產專案上出現一些問題,同一流程下涉及到多個數據庫表的增改出現不一致的情況; 例如tableA,tableB,tableC: 三張表同時做insert操作(或者是update操作),其中tableA,tableB儲存成功,tableC卻未能儲存成功;這樣的話,就造成生產伺服器上的資料不準確

SpringBoot學習筆記(三):SpringBoot整合MybatisSpringBoot事務管理SpringBoot多資料來源

SpringBoot整合Mybatis 第一步我們需要在pom.xml裡面引入mybatis相關的jar包 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artif

使用MyEclipse整合ssh(StrutsSpringHibernate)三大框架(環境搭載+例項原始碼下載)

前言 SSH不是一個框架,而是多個框架(struts+spring+hibernate)的整合,是目前較流行的一種Web應用程式開源整合框架,用於構建靈活、易於擴充套件的多層Web應用程式。 整合SSH框架的系統從職責上分為四層:表示層、業務邏輯層、資料持久層和域模組層(實

Spring管理 hibernate 事務配置的五種方式

Spring配置檔案中關於事務配置總是由三個組成部分,DataSource、TransactionManager和代理機制這三部分,無論是那種配置方法,一般變化的只是代理機制這塊! 首先我建立了兩個類,一個介面一個實現: Java程式碼  

Spring宣告式事務管理事務的傳播行為xml配置

 1. <tx:method name="insert*" propagation="REQUIRED" />中name的值是ServiceImpl中各個要加入事物管理的方法的方法名。 <!-- 事務管理: Spring宣告式事務管理 。

Spring+SpringMVC 配置事務管理無效原因解決方案。

一般我們在Spring的配置檔案application.xml中對Service層程式碼配置事務管理,可以對Service的方法進行AOP增強或事務處理如事務回滾,但是遇到一個問題,在Controller類中呼叫Service層方法,配置的事務管理會失效,查詢相

Spring宣告式事務管理事務巢狀

一>  事務配置 Spring動態代理的一個重要特徵是,它是針對介面的,所以我們的dao要通過動態代理來讓spring接管事務,就必須在dao前面抽象出一個介面,當然如果沒有這樣的介面,那麼spring會使用CGLIB來解決問題。     一般地,使用Spri

Spring Boot】(33)SpringBoot事務管理@Transactional註解原理

1、依賴包 1.1、 SpringBoot中的依賴包 眾所周知,在SpringBoot中凡是需要跟資料庫打交道的,基本上都要顯式或者隱式新增jdbc的依賴: <dependency> <groupId>org.springfram

spring中配置hibernate事務管理,出錯時事物不回滾

今天進行了spring整合hibernate,進行事務管理。出現了事務不回滾。檢查了好多遍,業務邏輯和配置檔案都沒有出錯,但是事務依舊不回滾,很是鬱悶。在網上查了很多資料。轉載一位博主的文章,挺不錯。 http://blog.csdn.net/u011622226/arti

Spring如何設定讓事務自動提交和回滾?Spring兩種事務管理方式的配置使用

1,我們要明確,Spring如何設定讓事務自動提交和回滾?        ①如何自動提交?           理論上,可以通過對DataSource如下設定,讓事務自動提交 <!-- 配置資料來源 --> <beanid="dataSour