V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ganning
V2EX  ›  Java

@Transactional 注解里的 rollbackFor=Exception.class 是否真的有意义?!

  •  
  •   ganning · 2021-06-05 15:39:45 +08:00 · 2433 次点击
    这是一个创建于 1269 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看 @Transactional 相关的博客,发现说事务只会在 Error 和 RuntimeException 时,才会回滚。

    所以必须配置 rollbackFor=Exception.class 才会在非运行时异常时,回滚数据。

    非运行时异常,不是通不过编译?!加上 try catch 之后不也会导致事务回滚失效?!

    那为什么还要求配置 rollbackFor=Exception.class ??

    有点迷惑,有大佬给解解惑吗?

    15 条回复    2021-06-06 17:44:23 +08:00
    JasonLaw
        1
    JasonLaw  
       2021-06-05 15:44:00 +08:00 via iPhone
    我之前提过一个相关的问题 - https://www.v2ex.com/t/771273
    JasonLaw
        2
    JasonLaw  
       2021-06-05 15:44:58 +08:00 via iPhone
    “ 非运行时异常,不是通不过编译?”是什么意思?
    limuyan44
        3
    limuyan44  
       2021-06-05 15:48:30 +08:00
    什么是非运行时异常,什么是 unchecked exception,什么是 checked exception 。
    ganning
        4
    ganning  
    OP
       2021-06-05 15:49:26 +08:00
    @JasonLaw 比如模拟一个非运行时异常,抛出一个 SQLException 。这个时候编译器会提示错误,让去处理这个异常
    ganning
        5
    ganning  
    OP
       2021-06-05 15:52:40 +08:00
    @limuyan44 非运行时异常就是受检异常,运行时异常就是非受检异常
    JasonLaw
        6
    JasonLaw  
       2021-06-05 15:52:43 +08:00 via iPhone
    @ganning #4 方法加上 throws SQLException 就可以了,你可以看看 https://dzone.com/articles/spring-transactional-amp-exceptions
    uselessVisitor
        7
    uselessVisitor  
       2021-06-05 15:59:24 +08:00
    IOException 这种如果 throws 了,不配置 rollbackFor=Exception.class 是不会回滚的
    Huiao
        8
    Huiao  
       2021-06-05 16:02:37 +08:00
    所以必须配置 rollbackFor=Exception.class 才会在非运行时异常时,回滚数据。
    --------

    所以必须配置 rollbackFor=Exception.class 才会在抛出受检异常时,回滚数据。

    关于受检异常和非受检异常 - https://www.cnblogs.com/Qkxh320/p/batj_01_exception.html
    ganning
        9
    ganning  
    OP
       2021-06-05 16:04:01 +08:00
    @JasonLaw 我本地做了一下场景模拟,确实是这样。方法上 throws Exception 了,那么 rollbackFor=Exception.class 就是有意义的。学到了

    @beichenhpy 是这样的,学到了学到了
    ganning
        10
    ganning  
    OP
       2021-06-05 16:09:15 +08:00
    @Huiao 嗯嗯,明白了。我钻了有异常就要捕获处理的牛角尖。抛出非运行时异常时,那么只有配置 rollbackFor=Exception.class 事务才会回滚
    uselessVisitor
        11
    uselessVisitor  
       2021-06-05 16:12:10 +08:00
    @ganning #10 其实也可以给非运行时异常 try catch 然后在 catch 中抛一个 RuntimeException 或者他的子类就行(狗头
    ganning
        12
    ganning  
    OP
       2021-06-05 16:15:34 +08:00
    @beichenhpy 禁止套娃😹
    beitayongguo
        13
    beitayongguo  
       2021-06-05 23:23:20 +08:00
    日常都会加 你不知道框架那里会给你抛啥奇奇怪怪的异常
    securityCoding
        14
    securityCoding  
       2021-06-06 15:47:34 +08:00 via Android
    jdbc 就是通过判断异常确定是否需要回滚,这是病
    xiangyuecn
        15
    xiangyuecn  
       2021-06-06 17:44:23 +08:00
    我能明确业务成功完成时需要提交事务,但不能决定业务中途的退出( return 、throw )是否一要提交事务

    所以:明确开启事务的情况下,没有提交的事务一律应当自动回滚,而不是自动提交!

    改成手动提交什么事情都没有,吐槽一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3367 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 12:08 · PVG 20:08 · LAX 04:08 · JFK 07:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.