spring事务实用开发
文章目录
一、spring事务简介
spring并不直接管理事务,而是使用事务管理器,本文使用常用的事务管理jdbc.datatsource.DataSourceTransactionManager,该事务管理器支持JDBC、Mybatis。
二、spring事务配置
spring事务配置是在spring配置文件中配置,包含内容如下:
2.1 添加事务管理器
添加事务管理器org.springframework.jdbc.datasource.DataSourceTransactionManager,即
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
2.2 添加支持事务的注解配置
添加支持事务的注解配置,即
<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true" /> <tx:annotation-driven transaction-manager="transactionManager" />
2.3、注解事务使用
注解事务使用,在方法上加注解@Transactional,如
@Transactional(propagation = Propagation.REQUIRED,timeout = 3)
三、spring事务的传播行为(Propagation)
spring事务传播行为,缺省的默认值是Propagation.REQUIRED,总的分为七种。
3.1 Propagation.REQUIRED
Propagation.REQUIRED,即方法必须在事务运行,该事务传播行为也是缺省的默认值。表现如下:
-
如果当前不存在事务,则新启一个事务;
-
如果当前存在事务,则在当前事务内运行;
3.2 Propagation.MANDATORY
Propagation.MANDATORY,即方法必须是在事务中运行,如果当前不存在事务,则直接抛出异常;
3.3 Propagation.NEVE
Propagation.NEVER,即方法不能在事务中运行,如果当存在事务,刚直接抛出异常;
3.4 Propagation.SUPPORTS
Propagation.SUPPORTS,即支持事务,表现如下:
- 如果当前存在事务,则在事务中运行;
- 如果不存在,在按无事务运行;
3.5 Propagation.NOT_SUPPORTED
Propagation.NOT_SUPPORTED,即不支持事务,如果当前存在事务,则把当前事务挂起,方法正常运行,方法运行结束后,再挂起的事务接着运行;
3.6 Propagation.NESTED
Propagation.NESTED,即嵌套事务,表现如下:
-
如果当前不存在事务,则行为与Propagation.REQUIRED一样;
-
如果当前存在事务,则在当前事务内新开子事务,同时只有外层事务提交时,子事务才会提交,
同理,外层事务回滚时,子事物也会回滚,但子事务出异常,外层事务是否回滚取决于对子事务异常的处理,总的说来,它是父事务与子事务的关系,或者说它最终只是一个事务,不存在死锁;
3.7 Propagation.REQUIRES_NEW
Propagation.REQUIRES_NEW,即新开事务,表示如下:
- 如果当前存在事务,则当前事务挂起,新开一个全新的事务运行,此时是两个事务(可能出现两个事务相互等待而出现死锁),即挂起的当前事务和新开的事务。
- 如果当前不存在事务,则新开事务;
四、spring事务超时管理timeout
timeout是spring事务的超时时间值,默认是-1,单位是秒。在事务中,由于各个事务挂起等待,可能出现死锁,所以设置事务的超时时间是有必要的。
五、注意点
-
基于注解的事务,也就是声明式事务,依赖于aop编程,因此如里在当前类中,各事务方法相互间调用,则aop配置的expose-proxy应设为true,调用时也需做相应处理,详情请查看本博客中的spring中aop开发。
-
使用Propagation.REQUIRES_NEW,则是两个完全独立的事务,而使用Propagation.NESTED则是父事务与子事务的关系,或者说就只有一个事务。
六、实例
6.1 添maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency