一、场景再现
我们同时操作两张表及以上,一张表操作成功后,第二张表操作失败,此时需要回滚上一次的操作。
或者两次操作都成功,但后续业务处理的时候异常,此时需要回滚前面的所有数据库操作。
二、代码
1 @Service 2 public class SiteWorkOrderServiceImpl implements ISiteWorkOrderService { 3 4 @Override 5 //在类或方法前注解配置@Transactional(rollbackFor=Exception.class)就可以实现: 6 //当发生受控异常(checked exceptions)时,事务也进行回滚。 7 @Transactional(rollbackFor=Exception.class) 8 public void createOrder() throws BaseBusinessException { 9 10 //第一次操作数据库 11 cbiOrderProcess.setWorkOrderNo(orderNo); 12 cbiOrderProcess.setTaskId(body.get("taskId")); 13 int insertNum = cbiOrderProcessMapper.insert(cbiOrderProcess); 14 Assert.isTrue(insertNum >0, "插入结果为空"); //利用Assert代替if 15 16 //第二次操作数据库 17 SiteWorkOrder siteWorkOrder = new SiteWorkOrder(); 18 //Assert.isTrue(1==2); //测试回滚 19 int orderNum = siteWorkOrderMapper.insert(siteWorkOrder); 20 Assert.isTrue(orderNum >0, "插入结果为空"); 21 } 22 }
三、现象描述
1、断点调试时,第一次操作完成,此时我们刷新数据库,实际是没有数据的
2、抛出异常,程序终止,数据库没有数据
3、要是第一次操作,表中有自增id,此时实际id已经自增,因为底层是序列,查询一次增加一次,要想回去,只能删除序列重新建。