消失的事务
端午节前,组内在讨论一个问题:
一个没有加@Transactional注解的方法,去调用一个加了@Transactional的方法,会不会产生事务?
文字苍白,还是用代码说话。
先写一个@Transactional的方法(本文的所有代码,可到Github上下载):
@Transactionalpublic void deleteAllAndAddOneTransactional(Customer customer) { customerRepository.deleteAll(); if ("Yang".equals(customer.getFirstName())) { throw new RuntimeException(); } customerRepository.save(customer);}
方法内先去执行deleteAll(),删除表中全部数据;然后执行save()保存数据。
这两个方法中间,会判断传进来的firstName是不是等于“Yang”,是,则抛异常,用于模拟两个数据库操作之间可能发生的异常场景。
如果没有加@Transactional注解,那么这两个操作就不在一个事务里面,不具有原子性。如果deleteAll之后抛异常,那么就会导致只删除不新增。
而加了@Transactional之后,这两个动作在一个事务里头,具有原子性,要么全部成功,要么全部失败。如果deleteAll之后抛异常,则事务回滚,恢复原先被删除的数据。
测试一下,启动Spring Bo