不支持当前事务的“女生”也分为 3 种(强势型或者叫事业型):
- Propagation.REQUIRES_NEW:不要你的房子,必须一起赚钱买房子 。
- Propagation.NOT_SUPPORTED:不要你的房子,必须一起租房子 。
- Propagation.NEVER:必须一起租房子 , 你有房子就分手 。
事务传播机制使用与演示接下来我们演示一下事务传播机制的使用,以下面 3 个最典型的事务传播级别为例:
- 支持当前事务的 REQUIRED;
- 不支持当前事务的 REQUIRES_NEW;
- 嵌套事务 NESTED 。
事务传播机制的示例,需要用到以下两张表:
-- 用户表CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `password` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `createtime` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC;-- 日志表CREATE TABLE `log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` text NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;创建一个 Spring Boot 项目,核心业务代码有 3 个:UserController、UserServcie 以及 LogService 。在 UserController 里面调用 UserService 添加用户,并调用 LogService 添加日志 。
REQUIRED 使用演示REQUIRED 支持当前事务 。UserController 实现代码如下,其中 save 方法开启了事务:
@RestControllerpublic class UserController { @Resource private UserService userService; @Resource private LogService logService; @RequestMapping("/save") @Transactional public Object save(User user) { // 插入用户操作 userService.save(user); // 插入日志 logService.saveLog("用户插入:" + user.getName()); return true; }}UserService 实现代码如下:
@Servicepublic class UserService { @Resource private UserMapper userMapper; @Transactional(propagation = Propagation.REQUIRED) public int save(User user) { return userMapper.save(user); }}LogService 实现代码如下:
@Servicepublic class LogService { @Resource private LogMapper logMapper; @Transactional(propagation = Propagation.REQUIRED) public int saveLog(String content) { // 出现异常 int i = 10 / 0; return logMapper.saveLog(content); }}执行结果:程序报错,两张表中都没有插入任何数据 。
执行流程描述:
REQUIRED_NEW 使用演示REQUIRED_NEW 不支持当前事务 。UserController 实现代码:
- 首先 UserService 中的添加用户方法正常执行完成 。
- LogService 保存日志程序报错,因为使用的是 UserController 中的全局事务,所以整个事务回滚,步骤 1 中的操作也跟着回滚 。
- 所以数据库中没有添加任何数据 。
@RequestMapping("/save")@Transactionalpublic Object save(User user) { // 插入用户操作 userService.save(user); // 插入日志 logService.saveLog("用户插入:" + user.getName()); return true;}
推荐阅读
- 好看的末世召唤流小说 好看的末世召唤小说?
- 有人说:“教育是服务业,教师是服务员”,你怎么看?
- 2021学生中秋假期讲话稿
- 我是哈尔滨兴隆镇的 我们这现在的猪价是五块八 朋友们你们说猪价还能涨吗?
- 适合晚上睡觉发朋友圈的说说 适合晚上睡觉发的朋友圈句子
- 不想恋爱的句子说说心情 恋爱的句子说说心情
- 早上起床适合发朋友圈的说说 早上起床适合发朋友圈的句子
- 海伦凯勒简介100字 海伦凯勒简介
- 魔道祖师:大家最想对羡羡说的一句话是什么?
- 猫一直舔主人怎么回事 猫一直舔自己怎么回事