1、Spring事務管理用到的三個接口spring
a. PlatformTransactionManager 事務管理器數據庫
b. TransactionDefinition 事務定義信息(隔離、傳播、超時、只讀)express
c. TransactionStatus 事務具體的運行狀態編程
2、Spring爲不一樣的持久化框架提供了不一樣的PlatformTransactionManager接口實現框架
事務 | 說明 |
org.springframework.jdbc.datasource.DataSourceTransactionManager | 使用Spring JDBC或iBatis進行持久化數據時使用 |
org.springframework.orm.hibernate5.HibernateTransactionManager | 使用Hibernate5.0版本進行持久化數據時使用 |
org.springframework.orm.jpa.JpaTransactionManager | 使用JPA進行持久化時使用 |
org.springframework.jdo.JdoTransactionManager | 當持久化機制是Jdo時使用 |
org.springframework.transaction.jta.JtaTransactionManager | 使用一個JTA實現來管理事務,在一個事務跨越多個資源時必須使用 |
3、Spring進行事務配置spa
1. 基於xml配置文件hibernate
2. 基於註解的方式code
還有一種是利用編程的方式進行的,這裏就不演示了。orm
4、搭建銀行轉帳的環境xml
也就是有JdbcTemplate、AccountService、AcountDao和C3P0的DataSource的配置,並在AccountService的一個方法中進行一個轉帳操做。
5、基於xml配置的方式
a. 在bean.xml中配置事務管理器
1 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 2 <!-- 指定對哪一個數據源進行操做的 --> 3 <!-- 屬性注入 --> 4 <property name="dataSource" ref="dataSource"></property> 5 </bean>
b. 配置事務的加強
1 <!-- 配置事務加強 --> 2 <tx:advice id="txAdvice" transactionManager="transactionManager"> 3 <tx:attributes> 4 5 <!-- name屬性是加強方法的名稱,propagation是傳播行爲 --> 6 <!-- 匹配加強方法的規則 --> 7 <!-- 這部分結構的規則是固定的,只須要改方法的匹配 --> 8 <tx:method name="account*" propagation="REQUIRED" /> 9 10 </tx:attributes> 11 </tx:advice>
c. 配置切入點和切面
1 <!-- 配置切入點和切面 --> 2 <aop:config> 3 <!-- 切入點 --> 4 <aop:pointcut expression="execution(* 全類名.*(..))" id="pointcut1" /> 5 <!-- 切面 --> 6 <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1" /> 7 </aop:config>
最好將這三個整合起來放到數據庫鏈接池的配置後面
1 <!-- 配置事務管理器 --> 2 <bean id="transactionManager" class="org.springframework.jdbc.dataSource.DataSourceTransactionManager"> 3 <!-- 指明對哪一個數據庫進行操做 --> 4 <property name="dataSource" ref="dataSource"></property> 5 </bean> 6 7 <!-- 配置事務加強 --> 8 <tx:advice id="txAdvice" transactionManager="transactionManager"> 9 <tx:attributes> 10 11 <!-- name屬性是加強方法的名稱,propagation是傳播行爲 --> 12 <!-- 匹配加強方法的規則 --> 13 <!-- 這部分結構的規則是固定的,只須要改方法的匹配 --> 14 <tx:method name="account*" propagation="REQUIRED" /> 15 16 </tx:attributes> 17 </tx:advice> 18 19 <!-- 配置切入點和切面 --> 20 <aop:config> 21 <!-- 切入點 --> 22 <aop:pointcut expression="execution(* 全類名.*(..))" id="pointcut1" /> 23 <!-- 切面 --> 24 <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1" /> 25 </aop:config>
寫完這個以後,通常要修改的地方就在於配置事務的加強管理器以及被加強的方法能夠改,其餘的不用怎麼改。
6、以及註解的方式配置
註解的配置方式要比配置文件簡單方便得多。
a. 配置事務管理器
1 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 2 <!-- 指定對哪一個數據源進行操做的 --> 3 <!-- 屬性注入 --> 4 <property name="dataSource" ref="dataSource"></property> 5 </bean>
b. 開啓事務註解
1 <!-- 開啓事務註解 --> 2 <tx:annotation-driven transaction-manager="transactionManager" />
c. 在具體使用事務的方法所在的類上添加註解
@Transactional,可是這一步很容易忘記。
1 @Transactional 2 public void accountMoney() { 3 4 }
總結:
1. 用Spring來進行事務管理仍是很方便的,利用文件配置寫的多,可是不少都是死的,利用註解來配置就很簡單了;
2. 總結下註解的使用,好比context,aop或者tx,都須要先在配置文件中有開啓註解的操做;
3. Spring啥時候會提交,啥時候會回滾呢?是發生異常的時候?那咱們豈不是沒有控制事務的管理權了,若是交給Spring管理的話?