当前位置: 代码迷 >> 综合 >> @transactional注解在什么情况下会失效,为什么?
  详细解决方案

@transactional注解在什么情况下会失效,为什么?

热度:93   发布时间:2024-02-10 16:04:41.0

1、一般在service里加@Transactional注解,不建议在接口上添加,加了此注解后此类会纳入spring事务管理中,每个业务方法执行时,都会开启一个事务,不过都是按照相同的管理机制。

2、@Transactional注解只能应用到public修饰符上,其它修饰符不起作用,但不报错。

3、默认情况下此注解会对unchecked异常进行回滚,对checked异常不回滚。

 

编译器能检测到的是checked,检测不到的就是unchecked。

派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常。

继承自Exception得异常统称为checked异常,如IOException、TimeoutException等。

 

4、只读事务:

@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

只读标志只在事务启动时应用,否则即使配置也会被忽略。

启动事务会增加线程开销,数据库因共享读取而锁定(具体跟数据库类型和事务隔离级别有关)。通常情况下,仅是读取数据时,不必设置只读事务而增加额外的系统开销。

 

PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作

 

解决注解不回滚问题:

1,检查方法是不是public

2,检查异常是不是unchecked异常

3,如果是checked异常也想回滚的话,注解上写明异常类型即可

@Transactional(rollbackFor=Exception.class)