每当使用 @Transactional
的时候该规约都提示我需要指定rollbackFor,但我认为是没必要的。理由如下:
Spring默认对Runtime和Error回滚无可厚非,毕竟无需显示处理。但是如果是Exception,不是需要人为的做处理吗?既然人为处理,又要分两种情况:
- catch了不做任何异常抛出,这样显然不用回滚;
- catch了又抛出Runtime,这种不用说肯定会回滚;
- catch了但又抛出了Exception,这种默认Spring不回滚;
- 不catch直接抛出Exception这种也是不回滚,与3同理。
再回到问题本身来看:
- Runtime和Error的情况Spring已经帮我们做了指定,没有必要重复指定。
- 而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>
7条答案
按热度按时间nxowjjhe1#
如果因某种情况抛出了空指针导致了线上的脏数据该怎么处理呢
eagi6jfj2#
@gujin520 关注下
gijlo24d3#
如果因某种情况抛出了空指针导致了线上的脏数据该怎么处理呢
没太理解你说的什么意思?空指针不是RuntimeException的子类吗,这个@transactional不是已经帮我们处理了?
wqnecbli4#
SQLException、IOException,不用回滚吗
knsnq2tg5#
SQLException、IOException,不用回滚吗
把我上面的内容再好好读读,相信你能理解。
gc0ot86w6#
每当使用
@Transactional
的时候该规约都提示我需要指定rollbackFor,但我认为是没必要的。理由如下: Spring默认对Runtime和Error回滚无可厚非,毕竟无需显示处理。但是如果是Exception,不是需要人为的做处理吗?既然人为处理,又要分两种情况:再回到问题本身来看:
@Transactional
就去提醒。当然,讨论本问题的本质不是说要不要指定rollbackFor,而是我们应该站在自身业务的角度去思考,我们应不应指定。一般来说对于方法内抛出的Exception(如楼下的IOException、SQLException)是不应该再抛到外层让调用方处理,调用方也是无法处理的。
另外我注意到此问题有其它提问 #518 ,并且我也看到回复是针对jdbc 层面的说法,希望该规约(插件也需要更新)能区分Spring-TX的情况,可以删除对该注解的提示,因为该注解本身就是Spring提供的,无需显示指定。
你忽略了还有5.
有低级人员使用了SneakyThrow强行扔……
nqwrtyyt7#
每当使用
@Transactional
的时候该规约都提示我需要指定rollbackFor,但我认为是没必要的。理由如下: Spring默认对Runtime和Error回滚无可厚非,毕竟无需显示处理。但是如果是Exception,不是需要人为的做处理吗?既然人为处理,又要分两种情况:再回到问题本身来看:
@Transactional
就去提醒。当然,讨论本问题的本质不是说要不要指定rollbackFor,而是我们应该站在自身业务的角度去思考,我们应不应指定。一般来说对于方法内抛出的Exception(如楼下的IOException、SQLException)是不应该再抛到外层让调用方处理,调用方也是无法处理的。
另外我注意到此问题有其它提问 #518 ,并且我也看到回复是针对jdbc 层面的说法,希望该规约(插件也需要更新)能区分Spring-TX的情况,可以删除对该注解的提示,因为该注解本身就是Spring提供的,无需显示指定。
你忽略了还有5. 有低级人员使用了SneakyThrow强行扔……
还有弱智一样的所谓“现代jvm语言”,比如kotlin,他们不区分Runtime和非Runtime的,全部不做抛出提示。你java调了它 它强行扔出来 就很难顶。