本文共 3194 字,大约阅读时间需要 10 分钟。
在代码中使用事务很简单,只需要在方法上添加好@Transactional注解即可
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;/** ** 服务实现类 *
* @author 小吾 * @since 2020-05-21 */@Servicepublic class UserServiceImpl extends ServiceImplimplements UserService { @Autowired private UserMapper userMapper; /** * 在方法上加上@Transactional注解,即可 */ @Transactional(rollbackFor = Exception.class) public String transactionNo1() { User user = new User(); user.setName("小吾1号"); user.setSex(1); userMapper.insert(user); System.out.println("没有异常事务不会触发,生成数据"); return "新增成功,没有异常"; } @Transactional(rollbackFor = Exception.class) public String transactionNo2() { User user = new User(); user.setName("小吾2号"); user.setSex(1); userMapper.insert(user); //这里我们给他出现一个异常使事务进行回滚 int x = 2 / 0; //如果我们这里想要抛出自己的异常,可以使用try{}catch (){}抛出自定义异常信息 System.out.println("这一段输出,就不会输出,直接执行事务回滚操作"); return "新增失败,异常捕获,事务回滚"; }}
其他方法间接
调用,否则事务会失效/** 我们通过非事务方法调用事务方法,这时会导致事务失效 */ public String transactionNo3() { return transactionalNo3(); } /** 这里触发异常,小吾3号会直接新增,不会进行回滚 */ @Transactional(rollbackFor = Exception.class) public String transactionalNo3(){ User user = new User(); user.setName("小吾3号"); user.setSex(1); userMapper.insert(user); int x = 2 / 0; return "新增失败,异常捕获,事务回滚"; }
/** * 我们在控制层方法上使用private这时我们会发现事务失效,数据新增成功 */ @GetMapping("/transactionNo4") @Transactional(rollbackFor = Exception.class) private String transactionNo4(){ System.out.println("测试事务是否回滚成功,方法4-非public方法使用事务"); User user = new User(); user.setName("小吾4号"); user.setSex(1); userMapper.insert(user); //备注,我在控制层使用mapper接口是相当不符合代码规范的,这里只用于测试,勿怪 int x = 2 / 0; return "方法4"; }
@Transactional(rollbackFor = Exception.class) public String transactionNo5() { User user = new User(); user.setName("小吾5号"); user.setSex(1); userMapper.insert(user); Timer timer = new Timer(); timer.schedule( new TimerTask() { @Override public void run() { System.out.println("hello"); //线程内部出现异常,并不会导致事务回滚 int x = 2/0; } },2000,4000 ); //同时线程外部异常也不会导致线程停止,但会使事务回滚 int x = 2 / 0; return "事务与线程"; }
@Transactional注解 rollbackFor默认是捕获(RuntimeException)运行时异常
类以及其子类的,当方法抛出(checked exception)编译时异常
是不会进行捕获的,例如:IOException;需要捕获这类异常我们就要修改rollbackFor的作用范围。
SpringBoot技术交流群14群号:719099151
我是小吾,有问题可以直接在群里@我 转载地址:http://mfhgn.baihongyu.com/