1.事务开启
声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解的方式
启动类上需要加上事务开启注解
@EnableTransactionManagement
2.特性
1、service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。
2、@Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。
3、默认情况下,Spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。
java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常,其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等
4、只读事务:
@Transactional(readOnly=true)
只读标志只在事务启动时应用,否则即使配置也会被忽略。
启动事务会增加线程开销,数据库因共享读取而锁定(具体跟数据库类型和事务隔离级别有关)。通常情况下,仅是读取数据时,不必设置只读事务而增加额外的系统开销。
属性名 | 说明 |
---|---|
name | 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。 |
propagation | 事务的传播行为,默认值为 REQUIRED、NOT_SUPPORTED、REQUIRESNEW、MANDATORY、SUPPORTS、NEVER、NESTED |
isolation | 事务的隔离度,默认值采用 DEFAULT。 |
timeout | 事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。 |
read-only | 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。 |
rollback-for | 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。 |
no-rollback- for | 抛出 no-rollback-for 指定的异常类型,不回滚事务。 |
事务不回滚的问题(是否会生效)
- 加于private方法, 无效
- 加于未加入接口的public方法, 再通过普通接口方法调用, 无效
- 加于接口方法,无论下面调用的是private或public方法, 都有效
- 加于接口方法后, 被本类普通接口方法直接调用, 无效
- 加于接口方法后,被本类普通接口方法通过接口调用, 有效
- 加于接口方法后, 被它类的接口方法调用, 有效
- 加于接口方法后, 被它类的私有方法调用后, 有效
- 是否开启了对注解的解析
- 异常是不是被你catch住了
- 你的异常类型是不是unchecked异常
@Transactional(rollbackFor=Exception.class) 使用rollbackFor的时候是否抛出类异常
- 手动回滚,在catch中添加回滚代码
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
https://blog.csdn.net/u011410529/article/details/54287307
https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html
https://segmentfault.com/a/1190000014617571