程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Spring應用——事務管理,spring應用事務

Spring應用——事務管理,spring應用事務

編輯:JAVA綜合教程

Spring應用——事務管理,spring應用事務


事務基礎:請參看:http://www.cnblogs.com/solverpeng/p/5720306.html

一、Spring 事務管理

1.前提:事務管理器

在使用 Spring 聲明式事務管理策略之前,必須配置事務管理器。

Spring 的核心事務管理器的頂級接口是 PlatformTransactionManager。

DataSourceTransactionManager:在應用程序中只需要處理一個數據源,而且通過 JDBC 進行存取。

HibernateTransactionManager:用 Hibernate 框架存取數據。

事務管理器以普通 Bean 的形式生命在 Spring IOC 容器中。如:

<context:property-placeholder location="db.properties"/>

<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
  <property name="user" value="${jdbc.user}"/>
  <property name="password" value="${jdbc.password}"/>
  <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
  <property name="driverClass" value="${jdbc.DriverClass}"/>
</bean>

<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

2.XML聲明式事務管理:Spring 通過 SpringAOP 框架支持聲明式事務。

(1)事務管理是一個橫切關注點。

(2)具體操作:

<1>在 <beans> 根元素中添加  tx Schema 的約束。可以通過 tx  Schema 中定義的 <tx:advice> 元素聲明事務增強。

<tx:advice transaction-manager="transactionManager" id="txAdvice"/>

<2>將增強配置到相應的 Spring AOP 切面。

<aop:config>
  <aop:pointcut id="bookPointcut" expression="execution(* *.BookServiceImpl.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="bookPointcut"/>
</aop:config>

需要注意的是:只有公有的方法才可以添加增強。

3.注解聲明式的管理事務:Spring 通過 @Transacational 注解聲明式地管理事務

(1)Spring 允許使用 @Transacational 注解來標注事務方法。只能標注公有方法。

(2)可以在方法或類級別添加 @Transactional 注解。當添加到類上時,這個類的所有公有方法都會被定義成支持事務處理的。

(3)Spring Config 文件中的配置:

<1>只需要添加 <tx:annotation-driven/> 節點,並為其指定事務管理器就好了。

<2>指定事務管理器:若事務管理器名稱是 transacationManager,就可以在 <tx:annotation-driven/> 節點中省略 transaction-manager 屬性。

該元素會自動檢測該名稱的事務管理器。

<context:property-placeholder location="db.properties"/>

<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
  <property name="user" value="${jdbc.user}"/>
  <property name="password" value="${jdbc.password}"/>
  <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
  <property name="driverClass" value="${jdbc.DriverClass}"/>
</bean>

<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

<tx:annotation-driven/>

二、Spring 事務傳播行為

1.JDBC 提供了事務隔離級別這種解決方案,Spring 對其進行了補充和擴展,就是 事務的傳播行為。

2.Spring 提供了七種事務傳播行為:

PROPAGATION_REQUIRED、PROPAGATION_REQUIRED_NEW、PROPAGATION_NESTED、PROPAGATION_SUPPORTS、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_MANDATORY

我自己理解的 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRED_NEW :

方法 A 調用方法 B:

(1)如果 A 是一個事務方法,B 也是一個事務方法,那麼 B 應該使用自己的事務還是 A 的事務?

如果使用 A 的事務 —— PROPAGATION_REQUIRED

如果使用 B 自己的事務 —— PROPAGATION_REQUIRED_NEW 

舉個例子來說明:

一個事務:A、B兩位同學去飯館吃飯

中午放學後,A 同學去飯館吃飯,恰巧剛剛認識的 B 同學也在飯館吃飯,A 同學是該自己吃呢?還是和 B 同學一起吃呢?

如果是和 B 一起 —— PROPAGATION_REQUIRED

如果是 A 自己吃 —— PROPAGATION_REQUIRED_NEW

(2)如果 A 是一個事務方法,B 不是一個事務方法,那麼 B 會使用 A 的事務。

提示:PROPAGATION 意思是 傳播

*上面是我自己的理解,沒有將所有的情況覆蓋,可能自己理解的也有偏差,看到此處的時候請小心求證。

(3)Spring 默認的事務傳播行為為 PROPAGATION_REQUIRED

三、Spring 事務其他功能

除了強大的事務傳播行為外,Spring 還提供了一些小的附加功能

1.事務超時——為了解決事務時間太長,消耗資源太多的問題,給事務設置一個最大時長,如果超時,則回滾事務。以 秒為單位。

2.只讀事務——表示這個事務只讀取數據而不更新數據

3.設置事務的回滾屬性

默認情況下只檢查運行時異常,會導致事務回滾。可以通過 rollbackFor 屬性來定義,如果不止一種,可以通過 "," 進行分割。

不論是事務的傳播行為還是事務的超時和只讀屬性,Spring 在 @Transactional 注解中提供了對應的屬性。

也可以通過 XML 的方式去配置,如

<tx:advice transaction-manager="transactionManager" id="bookAdvice">
  <tx:attributes>
    <tx:method name="shop" propagation="REQUIRED"/>
  </tx:attributes>
</tx:advice>

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved