spring下Hibernate的@transactional回滚机制

 

刚回顾完异常!现在继续来看下spring下@transactional回滚机制!

1.使用@transactional(不加参数)

@Transactional注解式的事务,默认是Check Exception(Exception.class)不回滚,

 

unCheck Exception(runtimeException.class)回滚。

原因我觉得是因为check exception我们会catch并且处理掉,而uncheck exception一般不会catch,因此默认只有uncheck exception会回滚。

当我们catch 了uncheck exception时,会发现出现了uncheck exception也不会回滚了。这是因为spring觉得,你自己已经意识到并且catch了这个异常,那你自己处理吧。我不回滚了!!

测试1:首先取得Thing表id=1的行,进行修改。然后再取id=6(实际表中没有)的行,进行get属性操作。

结果:表中数据没变化,抛出了nullpoint异常(属于runtime异常),事务回滚。

测试2:用catch抓住异常,并且不处理

结果:数据库更新了。事务没有回滚

测试3:catch住异常后,再抛出一个runtime异常

结果:事务回滚了,表中数据没变化。

结论:那么在正常的工作中,如果一个方法可能会抛出Check Exception,而我们catch了以后也没法处理,这时,我们可以catch完后throws一个runtime exception。这样,事务就会回滚了!也就是说一旦出现这个check exception。事务就回滚,这样不会对数据库造成影响。

2)使用@transactional(加参数)

还可以再后面默认加上rollbackFor 和 noRollbackFor参数。指定对那些异常类型进行回滚。

rollbackfor+异常类型:出现这个异常就回滚。

noRollbackFor+异常类型:出现这个异常就不回滚

而参数后面没有涉及到的异常,则按照第一类默认的方法处理。

猜你喜欢

转载自blog.csdn.net/m0_37914211/article/details/80998264