spring事务实用开发

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,单位是秒。在事务中,由于各个事务挂起等待,可能出现死锁,所以设置事务的超时时间是有必要的。

五、注意点

  1. 基于注解的事务,也就是声明式事务,依赖于aop编程,因此如里在当前类中,各事务方法相互间调用,则aop配置的expose-proxy应设为true,调用时也需做相应处理,详情请查看本博客中的spring中aop开发。

  2. 使用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值