Spring @Transactional事务调用注意事项

1、 建议@Transactional定义在接口

@Transactional直接定义在类上,会报错,因为spring 默认是jdk代理实现aop。可以在类上声明代理类型,防止报错:

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)

在这里插入图片描述

2、发生非运行时异常,默认事务不会生效

Spring @Transactional事务调用注意事项_第1张图片
可以修改@Transactional的rollbackFor,使得事务生效:

@Transactional(rollbackFor = Exception.class)

Spring @Transactional事务调用注意事项_第2张图片

3、同一个类里,非事务方法调用本类另外一个事务方法,不会生效

Spring @Transactional事务调用注意事项_第3张图片

4、同一个类里,事务方法调用本类其他具有事务的方法,以第一个事务方法为准

Spring @Transactional事务调用注意事项_第4张图片

同一个类里,事务方法调用本类同一个事务的方法,以第一个方法为准,被调用的方法的事务不生效

5、异常被catch不抛出,事务失效

Spring @Transactional事务调用注意事项_第5张图片

6、Spring 中事务控制的 API 介绍

先看看spring事务类结构定义:
Spring @Transactional事务调用注意事项_第6张图片

PlatformTransactionManager

此接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法,如下图:
Spring @Transactional事务调用注意事项_第7张图片

我们在开发中都是使用它的实现类,真正管理事务的对象:

  1. 使用 SpringJDBC 或 iBatis 进行持久化数据时使用:
    org.springframework.jdbc.datasource.DataSourceTransactionManager
  2. Hibernate 版本进行持久化数据时使用
    org.springframework.orm.hibernate5.HibernateTransactionManager

TransactionDefinition

它是事务的定义信息对象,里面有如下方法:
Spring @Transactional事务调用注意事项_第8张图片
事务的隔离级别
Spring @Transactional事务调用注意事项_第9张图片

事务的传播行为
Spring @Transactional事务调用注意事项_第10张图片

REQUIRED

  1. 默认值
  2. 表示当前执行方法必须有事务环境
  3. 如果当前执行方法没有事务环境,则创建新的事务;如果当前执行方法有事务环境,则加入当前事务,就不创建新的事务。
  4. 应用:添加、修改、删除需要指定事务的传播行为是:REQUIRED

SUPPORTS

  1. 支持事务
  2. 当前执行方法有事务环境则支持,没有事务环境也可以运行。事务可有可无。、
  3. 应用:查询

REQUERS_NEW

  1. 表示当前执行方法必须有事务环境
  2. 不管当前方法有没有事务环境,都会创建一个新的事务。

超时时间
默认值是-1,没有超时限制。如果有,以秒为单位进行设置。

是否是只读事务
建议查询时设置为只读。

TransactionStatus

此接口提供的是事务具体的运行状态,方法介绍如下图:
Spring @Transactional事务调用注意事项_第11张图片

你可能感兴趣的:(Spring)