p3c @Transactional 指定 rollbackFor?我认为没必要。

mwecs4sa  于 2个月前  发布在  其他
关注(0)|答案(7)|浏览(42)

每当使用 @Transactional 的时候该规约都提示我需要指定rollbackFor,但我认为是没必要的。理由如下:
Spring默认对Runtime和Error回滚无可厚非,毕竟无需显示处理。但是如果是Exception,不是需要人为的做处理吗?既然人为处理,又要分两种情况:

  1. catch了不做任何异常抛出,这样显然不用回滚;
  2. catch了又抛出Runtime,这种不用说肯定会回滚;
  3. catch了但又抛出了Exception,这种默认Spring不回滚;
  4. 不catch直接抛出Exception这种也是不回滚,与3同理。

再回到问题本身来看:

  1. Runtime和Error的情况Spring已经帮我们做了指定,没有必要重复指定。
  2. 而Exception则是根据业务来决定是否需要回滚,如果需要可以转换成Runtime这种Spring默认做了回滚,再去指定rollbackFor纯粹是多余。Spring默认不对Exception处理就是让你自己做选择,而现在到好,不管三七二十一全都需要设置。**当然如果说你抛出Exception,并且还希望回滚,这个时候可以让规约提醒你是否需要回滚,否则不处理。**总之,要不要指定rollbackFor,规约应该只在抛出Exception时候才去提醒,而不是只要用了 @Transactional 就去提醒。

当然,讨论本问题的本质不是说要不要指定rollbackFor,而是我们应该站在自身业务的角度去思考,我们应不应指定。一般来说对于方法内抛出的Exception(如楼下的IOException、SQLException)是不应该再抛到外层让调用方处理,调用方也是无法处理的。

另外我注意到此问题有其它提问 #518 ,并且我也看到回复是针对jdbc 层面的说法,希望该规约(插件也需要更新)能区分Spring-TX的情况,可以删除对该注解的提示,因为该注解本身就是Spring提供的,无需显示指定。

<entry key="java.exception.TransactionMustHaveRollbackRule.violation.msg.simple">
        <![CDATA[注解【Transactional】需要设置rollbackFor属性。]]>
    </entry>
nxowjjhe

nxowjjhe1#

如果因某种情况抛出了空指针导致了线上的脏数据该怎么处理呢

gijlo24d

gijlo24d3#

如果因某种情况抛出了空指针导致了线上的脏数据该怎么处理呢

没太理解你说的什么意思?空指针不是RuntimeException的子类吗,这个@transactional不是已经帮我们处理了?

wqnecbli

wqnecbli4#

SQLException、IOException,不用回滚吗

knsnq2tg

knsnq2tg5#

SQLException、IOException,不用回滚吗

把我上面的内容再好好读读,相信你能理解。

gc0ot86w

gc0ot86w6#

每当使用 @Transactional 的时候该规约都提示我需要指定rollbackFor,但我认为是没必要的。理由如下: Spring默认对Runtime和Error回滚无可厚非,毕竟无需显示处理。但是如果是Exception,不是需要人为的做处理吗?既然人为处理,又要分两种情况:

  1. catch了不做任何异常抛出,这样显然不用回滚;
  2. catch了又抛出Runtime,这种不用说肯定会回滚;
  3. catch了但又抛出了Exception,这种默认Spring不回滚;
  4. 不catch直接抛出Exception这种也是不回滚,与3同理。

再回到问题本身来看:

  1. Runtime和Error的情况Spring已经帮我们做了指定,没有必要重复指定。
  2. 而Exception则是根据业务来决定是否需要回滚,如果需要可以转换成Runtime这种Spring默认做了回滚,再去指定rollbackFor纯粹是多余。Spring默认不对Exception处理就是让你自己做选择,而现在到好,不管三七二十一全都需要设置。**当然如果说你抛出Exception,并且还希望回滚,这个时候可以让规约提醒你是否需要回滚,否则不处理。**总之,要不要指定rollbackFor,规约应该只在抛出Exception时候才去提醒,而不是只要用了 @Transactional 就去提醒。

当然,讨论本问题的本质不是说要不要指定rollbackFor,而是我们应该站在自身业务的角度去思考,我们应不应指定。一般来说对于方法内抛出的Exception(如楼下的IOException、SQLException)是不应该再抛到外层让调用方处理,调用方也是无法处理的。

另外我注意到此问题有其它提问 #518 ,并且我也看到回复是针对jdbc 层面的说法,希望该规约(插件也需要更新)能区分Spring-TX的情况,可以删除对该注解的提示,因为该注解本身就是Spring提供的,无需显示指定。

<entry key="java.exception.TransactionMustHaveRollbackRule.violation.msg.simple">
        <![CDATA[注解【Transactional】需要设置rollbackFor属性。]]>
    </entry>

你忽略了还有5.
有低级人员使用了SneakyThrow强行扔……

nqwrtyyt

nqwrtyyt7#

每当使用 @Transactional 的时候该规约都提示我需要指定rollbackFor,但我认为是没必要的。理由如下: Spring默认对Runtime和Error回滚无可厚非,毕竟无需显示处理。但是如果是Exception,不是需要人为的做处理吗?既然人为处理,又要分两种情况:

  1. catch了不做任何异常抛出,这样显然不用回滚;
  2. catch了又抛出Runtime,这种不用说肯定会回滚;
  3. catch了但又抛出了Exception,这种默认Spring不回滚;
  4. 不catch直接抛出Exception这种也是不回滚,与3同理。

再回到问题本身来看:

  1. Runtime和Error的情况Spring已经帮我们做了指定,没有必要重复指定。
  2. 而Exception则是根据业务来决定是否需要回滚,如果需要可以转换成Runtime这种Spring默认做了回滚,再去指定rollbackFor纯粹是多余。Spring默认不对Exception处理就是让你自己做选择,而现在到好,不管三七二十一全都需要设置。**当然如果说你抛出Exception,并且还希望回滚,这个时候可以让规约提醒你是否需要回滚,否则不处理。**总之,要不要指定rollbackFor,规约应该只在抛出Exception时候才去提醒,而不是只要用了 @Transactional 就去提醒。

当然,讨论本问题的本质不是说要不要指定rollbackFor,而是我们应该站在自身业务的角度去思考,我们应不应指定。一般来说对于方法内抛出的Exception(如楼下的IOException、SQLException)是不应该再抛到外层让调用方处理,调用方也是无法处理的。
另外我注意到此问题有其它提问 #518 ,并且我也看到回复是针对jdbc 层面的说法,希望该规约(插件也需要更新)能区分Spring-TX的情况,可以删除对该注解的提示,因为该注解本身就是Spring提供的,无需显示指定。

<entry key="java.exception.TransactionMustHaveRollbackRule.violation.msg.simple">
        <![CDATA[注解【Transactional】需要设置rollbackFor属性。]]>
    </entry>

你忽略了还有5. 有低级人员使用了SneakyThrow强行扔……

还有弱智一样的所谓“现代jvm语言”,比如kotlin,他们不区分Runtime和非Runtime的,全部不做抛出提示。你java调了它 它强行扔出来 就很难顶。

相关问题