004Spring事务003在Spring中使用事务

1 事务管理器

1.1 说明

Spring从不同的事务管理API中抽象出了一整套事务管理机制,让事务管理代码从特定的事务技术中独立出来。开发人员通过配置的方式进行事务管理,而不必了解其底层是如何实现的。

Spring的核心事务管理抽象是PlatformTransactionManager,它为事务管理封装了一组独立于技术的方法。无论使用Spring的哪种事务管理策略(编程式或声明式),事务管理器都是必须的。

1.2 主要实现类

DataSourceTransactionManager:在应用程序中只需要处理一个数据源,而且通过JDBC存取。

JtaTransactionManager:在JavaEE应用服务器上用JTA(Java Transaction API)进行事务管理。

HibernateTransactionManager:用Hibernate框架存取数据库。

2 基于注解的使用

2.1 配置文件

需要配置事务管理器,要求传入一个数据源。

需要开启基于注解的事务,使用tx名称空间开启。

 1 <!-- 配置扫描器。 -->
 2 <context:component-scan base-package="com" />
 3 <!-- 配置外部资源。 -->
 4 <context:property-placeholder location="classpath:jdbc.properties" />
 5 <!-- 配置数据源。 -->
 6 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
 7     <property name="user" value="${mysql.user}" />
 8     <property name="password" value="${mysql.password}" />
 9     <property name="jdbcUrl" value="${mysql.jdbcUrl}" />
10     <property name="driverClass" value="${mysql.driverClass}" />
11 </bean>
12 <!-- 配置JdbcTemplate框架的实例。 -->
13 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
14     <property name="dataSource" ref="dataSource" />
15 </bean>
16 <!-- 配置多事务管理器。 -->
17 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
18     <property name="dataSource" ref="dataSource" />
19 </bean>
20 
21 <!-- 使用tx名称空间开启基于注解的事务管理,transaction-manager表示事务管理器,当事务管理器的id为transactionManager时可省略。 -->
22 <tx:annotation-driven transaction-manager="transactionManager" />

2.2 在事务方法上使用注解

在需要进行多个操作的事务控制方法上加注解。

1 @Transactional
2 public void checkout(Book book) {
3     bookDao.updateSales(book.getSales() + 1, book.getId());
4     bookDao.updateStock(book.getStock() - 1, book.getId());
5 }

3 基于XML的使用

需要配置事务管理器,要求传入一个数据源。

需要配置需要事务管理的方法和切入点。

 1 <!-- 配置扫描器。 -->
 2 <context:component-scan base-package="com" />
 3 <!-- 配置外部资源。 -->
 4 <context:property-placeholder location="classpath:jdbc.properties" />
 5 <!-- 配置数据源。 -->
 6 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
 7     <property name="user" value="${jdbc.user}" />
 8     <property name="password" value="${jdbc.password}" />
 9     <property name="jdbcUrl" value="${jdbc.jdbcUrl}" />
10     <property name="driverClass" value="${jdbc.driverClass}" />
11 </bean>
12 <!-- 配置JdbcTemplate框架的实例。 -->
13 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
14     <property name="dataSource" ref="dataSource" />
15 </bean>
16 <!-- 配置多事务管理器。 -->
17 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
18     <property name="dataSource" ref="dataSource" />
19 </bean>
20 
21 <!-- 使用tx标签配置事务建议,transaction-manager表示事务管理器。 -->
22 <tx:advice transaction-manager="transactionManager" id="bookAdvice">
23     <tx:attributes>
24         <!-- 配置方法及其事务属性,name表示匹配的方法名。 -->
25         <tx:method name="*" propagation="REQUIRED" />
26     </tx:attributes>
27 </tx:advice>
28 <!-- 配置事务并把切入点和事务建议关联起来。 -->
29 <aop:config>
30     <!-- 指定切入点及切入点表达式。 -->
31     <aop:pointcut expression="execution(* com.tx.BookService.*(..))" id="bookPoint" />
32     <!-- 指定要使用的建议。 -->
33     <aop:advisor advice-ref="bookAdvice" pointcut-ref="bookPoint" />
34 </aop:config>

4 设置事务的隔离级别

4.1 基于注解的使用

可以在Transactional的isolation属性中设置事务的传播行为。

1 @Transactional(isolation=Isolation.READ_COMMITTED)

4.2 基于XML的使用

可以在tx名称空间的method标签中使用isolation属性设置。

1 <tx:method name="*" isolation="READ_COMMITTED" />

5 设置事务的传播行为

5.1 基于注解的使用

可以在Transactional的propagation属性中设置。

1 @Transactional(propagation=Propagation.REQUIRED)

5.2 基于XML的使用

可以在tx名称空间的method标签中使用propagation属性设置。

1 <tx:method name="*" propagation="REQUIRED" />

6 设置触发事务回滚的异常

默认捕获到RuntimeException或Error时回滚,而捕获到编译时异常不回滚。

6.1 设置事务回滚的异常

6.1.1 基于注解的使用

可以在Transactional的rollbackFor属性中设置,多个用逗号分隔。

1 @Transactional(rollbackFor={SQLException.class, ArithmeticException.class})

6.1.2 基于XML的使用

可以在tx名称空间的method标签中使用rollback-for属性设置,多个用逗号分隔。

1 <tx:method name="*" rollback-for="java.sql.SQLException, java.lang.ArithmeticException" />

6.2 设置事务不回滚的异常

6.2.1 基于注解的使用

可以在Transactional的noRollbackFor属性中设置,多个用逗号分隔。

1 @Transactional(noRollbackFor={SQLException.class, ArithmeticException.class})

6.2.2 基于XML的使用

可以在tx名称空间的method标签中使用no-rollback-for属性设置,多个用逗号分隔。

1 <tx:method name="*" no-rollback-for="java.sql.SQLException, java.lang.ArithmeticException" />

7 设置事务的只读属性

Spring的JdbcTemplate对只读操作做了一些优化。

7.1 基于注解的使用

可以在Transactional的readOnly属性中设置,true表示只读。

1 @Transactional(readOnly=true)

7.2 基于XML的使用

可以在tx名称空间的method标签中使用read_only属性设置,true表示只读。

1 <tx:method name="*" read-only="true" />

8 设置事务的超时属性

8.1 基于注解的使用

可以在Transactional的timeout属性中设置,默认为-1表示永不超时。

1 @Transactional(timeout=30)

8.2 基于XML的使用

可以在tx名称空间的method标签中使用timeout属性设置,默认为-1表示永不超时。

1 <tx:method name="*" timeout="30" />

 

posted @ 2022-01-24 23:46  执笔未来  阅读(26)  评论(0编辑  收藏  举报