《SpringBoot事务》单机mybatis事务控制

一、场景再现

  我们同时操作两张表及以上,一张表操作成功后,第二张表操作失败,此时需要回滚上一次的操作。

或者两次操作都成功,但后续业务处理的时候异常,此时需要回滚前面的所有数据库操作。

二、代码

 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已经自增,因为底层是序列,查询一次增加一次,要想回去,只能删除序列重新建。

原文地址:https://www.cnblogs.com/weipt0106/p/13257970.html