运用@Transactional,自己抛出异常时不会回滚的原因

运维 系统运维
对EJB来说,默认的行为是EJB容器在遇到系统异常 (通常指运行时异常)时自动回滚当前事务。EJB CMT遇到应用异常 (例如,除了java.rmi.RemoteException 外别的checked exception)时并不会自动回滚。默认式Spring处理声明式事务管理的规则遵守EJB习惯(只在遇到unchecked exceptions时自动回滚),但通常定制这条规则会更有用。

 对EJB来说,默认的行为是EJB容器在遇到系统异常 (通常指运行时异常)时自动回滚当前事务。EJB CMT遇到应用异常 (例如,除了java.rmi.RemoteException 外别的checked exception)时并不会自动回滚。默认式Spring处理声明式事务管理的规则遵守EJB习惯(只在遇到unchecked exceptions时自动回滚),但通常定制这条规则会更有用。

所以

package x.y.service;

public class DefaultFooService implements FooService {

    public Foo getFoo(String fooName) {
        throw new UnsupportedOperationException();
    }

    public Foo getFoo(String fooName, String barName) {
        throw new UnsupportedOperationException();
    }

    public void insertFoo(Foo foo) {
        throw new UnsupportedOperationException();
    }

    public void updateFoo(Foo foo) {
        throw new UnsupportedOperationException();
    }
}

(对该例的目的来说,上例中实现类(DefaultFooService )的每个方法在其方法体中抛出UnsupportedOperationException 的做法是恰当的,我们可以看到,事务被创建出来,响应UnsupportedOperationException 的抛出,然后回滚。)

@Transactional 有关的设置

在最简单的形式下,@Transactional 指定一个接口、类、方法必须是事务性的,其默认事务语义为:read/write,PROPAGATION_REQUIRED,ISOLATION_DEFAULT ,TIMEOUT_DEFAULT ,而且仅当遇到RuntimeException 时回滚,而不是Exception 。

改变事务设置的其他可选属性

Table 9.1. Transactional 注解的属性

属性 类型 描述
传播性 枚举型:Propagation 可选的传播性设置 (默认值:PROPAGATION_REQUIRED )
隔离性 枚举型:Isolation 可选的隔离性级别(默认值:ISOLATION_DEFAULT )
只读性 布尔型 读写型事务 vs. 只读型事务(默认值:false ,即只读型事务)
回滚异常类(rollbackFor) 一组 Class 类的实例,必须是Throwable 的子类 一组异常类,遇到时 确保 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException 的子类)才进行事务回滚。
回滚异常类名(rollbackForClassname) 一组 Class 类的名字,必须是Throwable 的子类 一组异常类名,遇到时 确保 进行回滚
不回滚异常类(noRollbackFor) 一组 Class 类的实例,必须是Throwable 的子类 一组异常类,遇到时确保 不 回滚。
不回滚异常类名(noRollbackForClassname) 一组 Class 类的名字,必须是Throwable 的子类 一组异常类,遇到时确保 不 回滚

 

我们推荐你参考 @Transactional 注解的javadoc,其中详细列举了上述各项属性及其可选值。

————————————————————————————————————

通过以上可知,在spring 中运用@Transactional 注解,自己抛出异常UnsupportedOperationException会 回滚,抛Exception异常,得作相关的配置才会回滚。

【编辑推荐】

  1. 技术解析 容错服务器技术还是双机冗余?
  2. Linux下使用mke2fsk格式化分区的方法
  3. Ubuntu 11.10 利用终端环境备份还原
责任编辑:赵宁宁
相关推荐

2020-11-18 10:16:52

数据库回滚事务

2010-05-05 09:05:07

checked异常

2020-11-18 08:32:07

数据库

2010-02-01 15:01:34

C++抛出异常

2022-09-14 19:50:22

事务场景流程

2009-11-16 17:15:12

Oracle减少回滚段

2009-11-16 13:41:18

Oracle分离回滚段

2009-07-20 18:11:52

iBATIS事务Spring

2017-05-18 16:07:23

回滚数据库代码

2012-12-26 09:36:45

MySQLDelete

2010-04-16 17:31:22

ORACLE回滚段

2009-03-18 08:59:28

throw异常Java

2011-07-29 16:21:21

Oracle数据库回滚段

2021-01-13 11:55:39

Spring代码Java

2021-06-07 09:37:05

异常Bug排查

2017-06-07 19:18:56

Oracle实例恢复前滚和回滚

2009-07-20 15:51:45

JDBC连接Oracl

2023-09-27 16:22:51

SpringMySQL原子性

2022-06-17 08:37:14

分布式事务分库分表

2023-10-12 10:04:03

Java代码
点赞
收藏

51CTO技术栈公众号