一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - spring聲明式事務解析

spring聲明式事務解析

2020-06-27 13:07woonu JAVA教程

這篇文章主要為大家詳細介紹了spring聲明式事務,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、spring聲明式事務

1.1 spring的事務管理器

spring沒有直接管理事務,而是將管理事務的責任委托給JTA或相應的持久性機制所提供的某個特定平臺的事務實現。spring容器負責事物的操作,spring容器充當切面,事務的方法稱為增強處理,生成的代理對象的方法就是目標方法+增強也就是crud+事務程序員只用做crud的操作,也就是目標方法和聲明哪些方法應該在事務中運行。

Spring提供了許多內置事務管理器實現:

DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,數據源事務管理器,提供對單個javax.sql.DataSource事務管理,用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事務管理;
JdoTransactionManager:位于org.springframework.orm.jdo包中,提供對單個javax.jdo.PersistenceManagerFactory事務管理,用于集成JDO框架時的事務管理;
JpaTransactionManager:位于org.springframework.orm.jpa包中,提供對單個javax.persistence.EntityManagerFactory事務支持,用于集成JPA實現框架時的事務管理;
HibernateTransactionManager:位于org.springframework.orm.hibernate3包中,提供對單個org.hibernate.SessionFactory事務支持,用于集成Hibernate框架時的事務管理;該事務管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本;
JtaTransactionManager:位于org.springframework.transaction.jta包中,提供對分布式事務管理的支持,并將事務管理委托給Java EE應用服務器事務管理器;
OC4JjtaTransactionManager:位于org.springframework.transaction.jta包中,Spring提供的對OC4J10.1.3+應用服務器事務管理器的適配器,此適配器用于對應用服務器提供的高級事務的支持;
WebSphereUowTransactionManager:位于org.springframework.transaction.jta包中,Spring提供的對WebSphere 6.0+應用服務器事務管理器的適配器,此適配器用于對應用服務器提供的高級事務的支持;
WebLogicJtaTransactionManager:位于org.springframework.transaction.jta包中,Spring提供的對WebLogic 8.1+應用服務器事務管理器的適配器,此適配器用于對應用服務器提供的高級事務的支持。
Spring不僅提供這些事務管理器,還提供對如JMS事務管理的管理器等,Spring提供一致的事務抽象如圖所示

spring聲明式事務解析

spring與hibernate

spring聲明式事務解析

說明:

spring在調用具體的事務管理器之前做了一些準備工作,提前設置事務的讀寫策略,而這些事務策略是公共的東西,是寫在spring的配置文件中的,這些內容的處理需要放在抽象類中去做

二、spring與hibernate整合中的事務處理

1.2 以xml形式
引入properties配置文件

?
1
2
3
<property name="locations">
  <value>classpath:jdbc.properties</value>
</property>

配置dbcp數據源

?
1
2
3
4
5
6
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
 </bean>

引入sessionfactory,使用hibernate外部配置文件

?
1
2
3
4
5
<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
      <value>classpath:hibernate.cfg.xml</value>
    </property>
</bean>

注入dao和service層

?
1
2
3
4
5
6
7
8
9
10
11
<bean id="personDao" class="cn.qjc.hibernate.dao.impl.PersonDaoImpl">
  <property name="sessionFactory">
    <ref bean="sessionFactory2"/>
  </property>
</bean>
 
<bean id="personService" class="cn.qjc.hibernate.service.impl.PersonServiceImpl">
  <property name="personDao">
    <ref bean="personDao"/>
  </property>
</bean>

 配置hibernate事務管理器

?
1
2
3
4
5
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
    <ref bean="sessionFactory2"/>
  </property>
 </bean>

配置聲明式事務

作用:

  1、告訴spring容器事務管理器

  2、告訴spring容器什么樣的方法使用什么樣的事務

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<tx:advice transaction-manager="transactionManager" id="tx">
  <tx:attributes>
    <!-- 
      name 目標方法的范圍
      islation 隔離級別
      propagation 傳播屬性      
      read-only
        true 只讀事務
        false 讀寫事務
     -->
    <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
  </tx:attributes>
 </tx:advice>

配置切入點

?
1
2
3
4
5
<aop:config>
  <aop:pointcut expression="execution(* cn.qjc.hibernate.service.impl.*.*(..))" id="perform"/>
    <span style="white-space:pre"> </span><!-- 將切入點應用到增強方法 -->
  <aop:advisor advice-ref="tx" pointcut-ref="perform"/>
 </aop:config>

dao實現類

?
1
2
3
4
5
6
7
8
9
10
* 實現方法一:繼承HibernateDaoSupport
 * @author qjc
 */
public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao{
 
  @Override
  public void savePerson(Person person) {
    this.getHibernateTemplate().save(person);
  }
}

測試

...

注意:

1、如果一個DAO類繼承了HibernateDaoSupport,只需要在spring配置文件中注入SessionFactory就可以了。

2、如果一個DAO類沒有繼承HibernateDaoSupport,需要有一個SessionFactory的屬性,并且在配置文件中進行注入。

?
1
2
3
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  <property name="sessionFactory" ref="sessionFactory2"></property>
</bean>

1.2 以注解形式

1、在配置文件中應用spring的自動掃描機制

<context:component-scan base-package="cn.qjc"/>

2、在配置文件中引入注解解析器

<tx:annotation-driven transaction-manager="transactionManager"/>

3、在service層通過@Transaction進行注解 

注意:如果在類級別上被注解為只讀事務,但是這個類中的方法中@Transaction注解的事務設置將優先于類級別注解的事務設置。

1.3 spring事務的傳播屬性

  required: 業務方法需要在一個事務中運行。如果方法運行時,已經處在一個事務中,那么加入到該事務,否則為自己創建一個新事務(默認)

  not-supported:spring容器不開啟事務,如果方法在一個事務中被調用,該事務會被掛起,該方法結束后,事務恢復

  requiresnew:不管是否存在事務,業務方法總會創建一個新事務。

  mandatorky: 業務方法只能在一個已經存在的事務中執行,如果業務方法在沒有事務下調用,容器拋出例外。

此外還有supports、never、nested等屬性,但是通常使用默認

propagation="required" 此配置可以解決事務嵌套問題,何為事務嵌套?

比如:

spring聲明式事務解析

在工作流框架和操作service層的某個方法中都存在事務,service層也有自己的事務,當service執行的時候,就會出現事務嵌套,即方法本身有事務,方法中的方法還有事務,這就是事務嵌套。而spring通過事務傳播屬性propagation="required"解決了這一問題。

 1.4 OpenInSessionView

在s2sh整合以后,spring管理事務,由于使用的是spring的聲明式事務處理方式,所以在調用this.getHibernateTemplate()這個方法執行完之后,session立即關閉,如果當前執行的方法有事務,當事務環境的方法被調用完畢后session關閉。所以當值在頁面輸出時會產生異常。

處理方式為:OpenSessionInview模式(web.xml中配置)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<filter>
  <filter-name>hibernateFilter</filter-name>
  <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
   
  <!-- singleSession默認為true,若設置為false則等于沒有OpenSessionInView -->
  <init-param>
    <param-name>singleSession</param-name>
    <param-value>true</param-value>
  </init-param>
 </filter>
 
 <filter-mapping>
  <filter-name>hibernateFilter</filter-name>
  <url-pattern>/PersonService</url-pattern>  
 </filter-mapping>

從上面代碼可以看出,當提交一個請求時,OpenSessionInView中已經把session開啟了,在response以后才要關閉session,也就意味著有了openSessionInView必須在struts2的過濾器之前。(放struts2過濾器位置上面) 

但是開啟OpenSessionInView也有缺點:因為session關閉被延后了,而hibernate的一級緩存在session中,所以會導致大量的緩存中的數據被長時間停留在內存中。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品va在线观看无 | 韩国一级淫片特黄特刺激 | 黑人疯狂巨大xxoo | 精品国产麻豆免费人成网站 | 无人在线视频高清免费观看动漫 | 99这里精品 | 精品国产美女AV久久久久 | 国内外精品免费视频 | 亚洲羞羞视频 | 高清在线观看免费入口 | 亚洲va国产日韩欧美精品色婷婷 | 免费欧美一级 | 亚洲欧美一级夜夜爽w | 国产精品视频一区二区三区 | 日韩一区三区 | 男女真实无遮挡xx00动态图软件 | 久久精品国产亚洲AV蜜臀 | 日产中文乱码卡一卡二 | 97菊爱网| 国产高清一区二区三区免费视频 | 男女男在线精品网站免费观看 | 午夜精品在线视频 | 久久精视频 | 免费jizz在在线播放国产 | 日本无卡无吗中文免费 | 国产草草视频 | 日韩成本大片35分钟免费播放 | 国产成人综合久久 | 欧美在线观看视频一区 | 亚洲国产综合久久久无码色伦 | 九九99香蕉在线视频美国毛片 | 亚洲成人视屏 | 亚洲视频一 | 欧美最猛性xxxxx动态图 | 日本小视频免费 | 欧美国产视频 | 日本人成年视频在线观看 | 男公厕里同性做爰 | 日本暖暖视频在线观看 | ts人妖系列在线专区 | 欧美日韩一区二区三区免费 |