企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
如果现在我们要删除person表中id为5的记录,但是在PersonServiceBean类的delete()方法中,人为地抛出一个运行时异常,如下 ~~~ public void delete(Integer personid) { jdbcTemplate.update("delete from person where id=?", new Object[]{personid}, new int[]{java.sql.Types.INTEGER}); throw new RuntimeException("运行期异常"); } ~~~ 此时测试PersonServiceTest类中的delete()方法: ~~~ @Test public void delete() { personService.delete(5); } ~~~ 会发现Eclipse控制台打印出一个异常,立马查看person表,发现id为5的记录没有删除掉,这就说明了Spring容器默认情况下对运行时异常,它会进行事务的回滚。 如果在PersonServiceBean类的delete()方法中,人为地抛出一个检查时异常,如下: ~~~ public void delete(Integer personid) throws Exception { jdbcTemplate.update("delete from person where id=?", new Object[]{personid}, new int[]{java.sql.Types.INTEGER}); throw new Exception("检查时异常"); } ~~~ 为了不报错,我们还须将PersonService接口中的delete()方法签名修改为: ~~~ /** * 删除指定id的person */ public void delete(Integer personid) throws Exception; ~~~ 此时测试PersonServiceTest类中的delete()方法 ~~~ @Test public void delete() { try { personService.delete(5); } catch (Exception e) { e.printStackTrace(); } } ~~~ 会发现控制台打印出一个异常,立马查看person表,发现id为5的记录被删除掉,这就说明了如果Spring容器碰到的是用户异常,如检查时异常(checked exception),这时事务就不会回滚。 当然我们也可改变这种规则: * 当Spring容器碰到用户异常——如检查时异常(checked exception)时,让事务回滚。 那到底该怎么办呢?此时就需要用到事务的rollbackFor属性了。我们将PersonServiceBean类的delete()方法修改为: ~~~ @Transactional(rollbackFor=Exception.class) public void delete(Integer personid) throws Exception { jdbcTemplate.update("delete from person where id=?", new Object[]{personid}, new int[]{java.sql.Types.INTEGER}); throw new Exception("检查时异常"); } ~~~ 此时测试PersonServiceTest类中的delete()方法: ~~~ @Test public void delete() { try { personService.delete(4); } catch (Exception e) { e.printStackTrace(); } } ~~~ 会发现控制台打印出一个异常,立马查看person表,发现id为4的记录没有被删除掉。 * 当Spring容器碰到运行时异常时,不让它进行事务的回滚,而是提交事务。 那到底该怎么办呢?此时就需要用到事务的rollbackFor属性了。我们将PersonServiceBean类的delete()方法修改为: ~~~ @Transactional(noRollbackFor=RuntimeException.class) public void delete(Integer personid) throws Exception { jdbcTemplate.update("delete from person where id=?", new Object[]{personid}, new int[]{java.sql.Types.INTEGER}); throw new RuntimeException("运行期异常"); } ~~~ 此时测试PersonServiceTest类中的delete()方法, 会发现Eclipse控制台打印出一个异常,立马查看person表,发现id为4的记录已经被删除掉了。