Spring在异常发生时默认的回滚策略测试

来源:互联网 发布:淘宝的欧莱雅是真的吗 编辑:程序博客网 时间:2024/06/14 07:00

项目中为了方便,就直接使用了@Transactional注解,并且没有添加属性。工作中发现有的时候事务会回滚,有的不会,查了下,说Spring只会在RuntimeException发生时才会回滚,如果发生可检查的Exception就不回滚。我当时的疑惑是:

1. 如果代码里发生了Exception,但是被我抓住后,又抛出RuntimeException,事务还会回滚吗?

2. 我的情况是无论事务是否成功,都需要更新某个表关于这个事务成功与否的状态,我是放在finally块里面执行,它也会被一道回滚吗?

开始我的测试,首先是抓住异常并抛出Exception,代码如下:

@Transactionalpublic int saveData() throws Exception{int i = 2; try {jdbc.execute("insert into DEATH (PERSON_ID, DEATH_DATE, DEATH_TYPE_CONCEPT_ID) values (2, TO_DATE(SYSDATE),2)");jdbc.execute("insert into DEATH (PERSON_ID, DEATH_TYPE_CONCEPT_ID) values (1,1)");i = 3;} catch (DataAccessException e) {throw new Exception("err----------", e);} finally {jdbc.execute("insert into DEATH (PERSON_ID, DEATH_DATE, DEATH_TYPE_CONCEPT_ID) values (3, TO_DATE(SYSDATE),3)");}return i;}

执行后的结果如下图,发现事物没有回滚:



修改代码,抛出RuntimeException,代码如下:

@Transactionalpublic int saveData() throws Exception{int i = 2; try {jdbc.execute("insert into DEATH (PERSON_ID, DEATH_DATE, DEATH_TYPE_CONCEPT_ID) values (2, TO_DATE(SYSDATE),2)");jdbc.execute("insert into DEATH (PERSON_ID, DEATH_TYPE_CONCEPT_ID) values (1,1)");i = 3;} catch (DataAccessException e) {throw new RuntimeException("err----------", e);} finally {jdbc.execute("insert into DEATH (PERSON_ID, DEATH_DATE, DEATH_TYPE_CONCEPT_ID) values (3, TO_DATE(SYSDATE),3)");}return i;}

执行结果如下图,事务回滚了,并且finally块里的操作也被回滚:


0 0
原创粉丝点击