@Transactional 注解里的 rollbackFor=Exception.class 是否真的有意义?! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ganning
V2EX    Java

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

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

    最近看 @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
    我之前提过一个相关的问题 - 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
    zm8m93Q1e5otOC69
        7
    zm8m93Q1e5otOC69  
       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 事务才会回滚
    zm8m93Q1e5otOC69
        11
    zm8m93Q1e5otOC69  
       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     Solana     5178 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 05:43 PVG 13:43 LAX 21:43 JFK 00:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86