前面介绍了 Spring Boot 中的整合 Mybatis 并实现增删改查. 不清楚的朋友可以看看之前的文章: https://www.cnblogs.com/zhangweizhong/category/1657780.html.
Spring Boot 整合完 Mybatis, 有个特别重要的功能之前忘记讲了: 那就是 Spring Boot 如何实现事物控制. 在我们的实际系统中, 事务会被经常用到. 特别是数据库操作或者是复杂的业务操作时, 必须事物执行. 必须保证本次业务的处理结果更改要么都成功, 要么都失败. 那么这种场景下, 我们改如何实现呢?
为什么要事务
以转账业务为例: 一次转载业务涉及数据库表的两次更改. 为确保业务完整性, 需保证这两次更改要么都成功, 要么都失败. 否则账户金额就做了, 后果非常严重.
事务播行为
Propagation.REQUIRED -- 支持当前事务, 如果当前没有事务, 就新建一个事务, 最常见的选择.
Propagation.SUPPORTS -- 支持当前事务, 如果当前没有事务, 就以非事务方式执行
Propagation.MANDATORY -- 支持当前事务, 如果当前没有事务, 就抛出异常.
Propagation.REQUIRES_NEW -- 新建事务, 如果当前存在事务, 把当前事务挂起, 两个事务之间没有关系, 一个异常, 一个提交, 不会同时回滚.
Propagation.NOT_SUPPORTED -- 以非事务方式执行操作, 如果当前存在事务, 就把当前事务挂起.
Propagation.NEVER -- 以非事务方式执行, 如果当前存在事务, 则抛出异常
如何实现
1, 首先创建 Spring Boot 项目, 并整合 Mybatis 相关的依赖. 这个之前的文章讲过, 大家可以看我这篇文章:《Spring Boot 入门系列 (六)Spring Boot 如何整合 Mybatis[附详细步骤] 》
2, 在需要事务的方法上添加 @Transactional 注解, 并通过 propagation 指定事务机制.
修改 UserServiceImpl 类和 UserService 类, 增加 saveUserTransactional 方法.
- @Override
- @Transactional(propagation = Propagation.REQUIRED)
- public void saveUserTransactional(SysUser user) {
- userMapper.insert(user);
- int a = 1 / 0;
- user.setIsDelete(1);
- userMapper.updateByPrimaryKeySelective(user);
- }
说明:
propagation = Propagation.REQUIRED
是默认的事务机制, 若当前有事务则支持当前事务, 否则新建事务.
springboot 开启事物很简单, 只需要加注解 @Transactional 即可.
@Transactional 也可以加在类上, 则该类所有方法都遵循该注解配置.
3, 测试调用
在之前的 MyBatisCRUDController 增加测试方法: saveUserTransactional.
- @RequestMapping("/saveUserTransactional")
- public JSONResult saveUserTransactional() {
- String userId = sid.nextShort();
- SysUser user = new SysUser();
- user.setId(userId);
- user.setUsername("weiz" + new Date());
- user.setNickname("weiz" + new Date());
- user.setPassword("abc123");
- user.setIsDelete(0);
- user.setRegistTime(new Date());
- userService.saveUserTransactional(user);
- return JSONResult.ok("保存成功");
- }
测试
首先我们看目前的 sql 数据中的数据, user 表中数据如下:
在浏览器中数据: http://localhost:8080/mybatis/saveUserTransactional, 也没返回执行异常, 数据库中的数据也没有变化, 说明数据已经回滚了:
最后
以上, 就把 Spring Boot 中事物控制讲完了, 是不是特别简单.
来源: https://www.cnblogs.com/zhangweizhong/p/12680873.html