当前位置: 首页 > 后端技术 > Java

SpringBoot——基于@Transactional注解的事务回滚

时间:2023-04-01 18:19:28 Java

1.创建数据库实体类和mapper1.1数据库字段数据库表字段如下:1.2创建对应的实体类包com.aries.jc.dciTest.modules.entity.local;importcom.baomidou.mybatisplus.annotation.TableField;importcom.baomidou.mybatisplus.annotation.TableName;importlombok.Data;@Data@TableName("tb_test")publicclassTbTest{@TableField("region_name")privateStringregionName;@TableField("region_code")privateStringregionCode;@TableField("region_config")privateIntegerregionConfig;}1.3创建对应的mapperpackagecom.aries.jc.dciTest.modules.mapper.local;importcom.aries.jc.dciTest.modules.entity.local.TbTest;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importorg.apache.ibatis.annotations.Mapper;@MapperpublicinterfaceTbTestMapperextendsBaseMapper{}1.4创建服务层接口:packagecom.aries.jc.dciTest.modules。服务;导入com.aries.jc.dciTest.modules.entity.local.TbTest;导入com.hikvision.ga.common.BaseResult;公共接口TbTestService{BaseResultinsertTbTest1(TbTesttbTest);BaseResultinsertTbTest2(TbTesttbTest);BaseResultinsertTbTest3(TbTesttbTest);}1.5创建服务层接口实现类方法insertTbTest1进行正常的数据库添加操作方法insertTbTest2进行数据库添加操作后,会通过intl=2/0;触发异常方法insertTbTest3在执行数据库添加操作后,会触发异常intl=2/0;但是在方法中添加注解@Transactional(rollbackFor=Exception.class)执行事务回滚包com.aries.jc.dciTest.modules.service.impl;importcom.aries.jc.dciTest.modules.entity。local.TbTest;导入com.aries.jc.dciTest.modules.mapper.local.TbTestMapper;导入com.aries.jc.dciTest.modules.service.TbTestService;导入com.hikvision.ga.common.BaseResult;导入org.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;@Servicepublic类TbTestServiceImpl实现TbTestService{privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(TbTestServiceImpl.class);@Autowired私有TbTestMappertbTestMapper;/***在不触发异常的情况下向数据库添加操作*@paramtbTest*@return*/@OverridepublicBaseResultinsertTbTest1(TbTesttbTest){BaseResultbaseResult=newBaseResult();//向数据库添加操作inti=tbTestMapper.insert(tbTest);if(i!=0){LOGGER.info("添加成功");}baseResult.setMsg("添加成功");baseResult.setCode("0");返回基础结果;}/***添加数据库操作,添加后触发异常,但不执行事务回滚*@paramtbTest*@return*/@OverridepublicBaseResultinsertTbTest2(TbTesttbTest){BaseResultbaseResult=newBaseResult();//向数据库添加操作inti=tbTestMapper.insert(tbTest);if(i!=0){LOGGER.info("添加成功");}//触发异常intl=2/0;baseResult.setMsg("添加成功");baseResult.setCode("0");返回基础结果;}/***向数据库添加操作,添加后触发异常,执行事务回滚*@paramtbTest*@return*/@Override@Transactional(rollbackFor=Exception.class)publicBaseResultinsertTbTest3(TbTesttbTest){BaseResultbaseResult=newBaseResult();//向数据库添加操作inti=tbTestMapper.insert(tbTest);if(i!=0){LOGGER.info("添加成功");}//触发异常intl=2/0;baseResult.setMsg("添加成功");baseResult.setCode("0");返回基础结果;}}1.6创建controller层包com.aries.jc.dciTest.modules.controller;importcom.aries.jc.dciTest.modules.entity.local.PointConfig;importcom.aries.jc.dciTest.modules.entity.local.TbTest;导入com.aries.jc.dciTest.modules.service.TbTestService;导入com.hikvision.ga.common.BaseResult;导入io.swagger.annotations.Api;导入io.swagger.annotations.ApiOperation;导入组织。springframework.beans.factory.annotation.Autowired;导入org.springframework.web.bind.annotation.RequestBody;导入org.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.RestController;importjava.util.List;@RestController@Api(tags="测试")@RequestMapping("/test")publicclassTbTestController{@AutowiredprivateTbTestServicetbTestService;@RequestMapping(value="/insert1",method=RequestMethod.POST)@ApiOperation("测试事务回滚:正常添加,未触发异常")publicBaseResultinsertTbTest1(@RequestBodyTbTesttbTest){returntbTestService.insertTbTest1(tbTest);}@RequestMapping(value="/insert2",method=RequestMethod.POST)@ApiOperation("测试事务回滚:正常添加,添加后触发异常,不进行事务回滚")publicBaseResultinsertTbTest2(@RequestBodyTbTesttbTest){返回tbTestService.insertTbTest2(tbTest);}@RequestMapping(value="/insert3",method=RequestMethod.POST)@ApiOperation("测试事务回滚:正常添加,添加后触发异常,执行事务回滚")publicBaseResultinsertTbTest3(@RequestBodyTbTesttbTest){返回tbTestService.insertTbTest3(tbTest);}}2.swagger测试:正常添加,没有触发异常:方法insertTbTest1正常添加到数据库,添加后触发异常,不执行事务回滚:方法insertTbTest2成功添加到数据库后,触发异常,但是因为没有事务回滚,添加的对象保留在数据库中正常添加,添加后触发异常,执行事务回滚:方法insertTbTest3添加成功后数据库,触发了异常,但是由于事务设置了Rollback,数据库回滚到方法调用前的状态,即数据库中没有新添加的对象