1.内部使用@Transactional
使用@Transactional注解后,tbUser2的插入由于违背id唯一约束会被catch捕获并且抛出异常,此时会发生回滚,tbUser1也不好正确插入。
@Transactional
@Override
public void transactional(){
TbUser tbUser1 = TbUser.builder()
.username("陈双双")
.address("前海时代卓越广场")
.build();
TbUser tbUser2 = TbUser.builder()
.id(8)
.username("陈圆圆")
.address("江西应用科技学院")
.build();
try {
tbUserMapper.insert(tbUser1);
log.info("插入第一条数据");
} catch (Exception e){
log.info("插入第一条时出错",e);
}
try{
tbUserMapper.insert(tbUser2);
log.info("插入第二条数据");
} catch (Exception e){
throw new RuntimeException();
}
}
2.调用服务使用@Transactional
在调用其他服务时,即使被调用服务即使没有使用@Transactional注解,注解依然可以正常生效,tbUser1插入操作发生回滚,事务正常执行。
@Transactional
@Override
public void transactional(){
TbUser tbUser1 = TbUser.builder()
.username("陈双双")
.address("前海时代卓越广场")
.build();
try {
tbUserMapper.insert(tbUser1);
log.info("插入第一条数据");
} catch (Exception e){
log.info("插入第一条时出错",e);
}
userService.insertUser();
}
@Override
public void insertUser() {
TbUser tbUser2 = TbUser.builder()
.id(8)
.username("陈圆圆")
.address("江西应用科技学院")
.build();
try{
tbUserMapper.insert(tbUser2);
log.info("插入第二条数据");
} catch (Exception e){
throw new RuntimeException();
}
}
本文用于自身笔记记录,springboot会存在部分@Transactional注解失效的情况,需根据具体情况分析。