Springboot mini - Solon详解(四)- Solon的事务传播机制
Springboot min -Solon 详解系列文章:
Springboot mini - Solon详解(一)- 快速入门
Springboot mini - Solon详解(二)- Solon的核心
Springboot mini - Solon详解(三)- Solon的web开发
在前面的篇章里我们已经见识了 Springboot mini - Solon 对事务的控制,及其优雅曼妙的身姿。该篇将对事务及其处理策略进行详解。出于对用户的学习成本考虑,Solon 借签了Spring 的事务传播策略;所以体验上几乎一样。
一、为什么要有传播机制?
Solon 对事务的控制,是使用 aop 切面实现的,所以不用关心事务的开始,提交 ,回滚,只需要在方法上加 @Tran 注解即可。
因为这些都是暗的,看不见的,所以也容易产生一些疑惑:
- 场景一:classA 方法调用了 classB 方法,但两个方法都有事务
如果 classB 方法异常,是让 classB 方法提交,还是两个一起回滚?
- 场景二:classA 方法调用了 classB 方法,但是只有 classA 方法加了事务
是否把 classB 也加入 classA 的事务,如果 classB 异常,是否回滚 classA?
- 场景三:classA 方法调用了 classB 方法,两者都有事务,classB 已经正常执行完,但 classA 异常
是否需要回滚 classB 的数据?
这个时候,传说中的事务传播机制和策略就派上用场了
二、传播机制生效条件
所有用 aop 实现的事务控制方案 ,都是针对于接口或类的。所以在同一个类中两个方法的调用,传播机制是不生效的。
三、传播机制的策略
下面的类型都是针对于被调用方法来说的,理解起来要想象成两个 class 方法的调用才可以。
| 传番策略 | 说明 |
|---|---|
| TranPolicy.required | 支持当前事务,如果没有则创建一个新的。这是最常见的选择。也是默认。 |
| TranPolicy.requires_new | 新建事务,如果当前存在事务,把当前事务挂起。 |
| TranPolicy.nested | 如果当前有事务,则在当前事务内部嵌套一个事务;否则新建事务。 |
| TranPolicy.mandatory | 支持当前事务,如果没有事务则报错。 |
| TranPolicy.supports | 支持当前事务,如果没有则不使用事务。 |
| TranPolicy.not_supported | 以无事务的方式执行,如果当前有事务则将其挂起。 |
| TranPolicy.never | 以无事务的方式执行,如果当前有事务则报错。 |
四、事务的隔离级别
| 属性 | 说明 |
|---|---|
| unspecified | 默认(JDBC默认) |
| read_uncommitted | 脏读:其它事务,可读取未提交数据 |
| read_committed | 只读取提交数据:其它事务,只能读取已提交数据 |
| repeatable_read | 可重复读:保证在同一个事务中多次读取同样数据的结果是一样的 |
| serializable | 可串行化读:要求事务串行化执行,事务只能一个接着一个执行,不能并发执行 |
五、@Tran 属性说明
| 属性 | 说明 |
|---|---|
| policy | 事务传导策略 |
| isolation | 事务隔离等级 |
| readOnly | 是否为只读事务 |
六、示例
- 父回滚,子回滚
@Service
public class UserService{
@Tran
public void addUser(UserModel user){
//....
}
}
@Controller
public class DemoController{
@Inject
UserService userService;
//父回滚,子回滚
//
@Tran
@Mapping("/user/add2")
pubblic void addUser2(UserModel user){
userService.addUser(user);
throw new RuntimeException("不让你加");
}
}
- 父回滚,子不回滚
@Service
public class UserService{
@Tran(policy = TranPolicy.requires_new)
public void addUser(UserModel user){
//....
}
}
@Controller
public class DemoController{
@Inject
UserService userService;
//父回滚,子不回滚
//
@Tran
@Mapping("/user/add2")
pubblic void addUser2(UserModel user){
userService.addUser(user);
throw new RuntimeException("不让你加;但还是加了:(");
}
}
- 子回滚父不回滚
@Service
public class UserService{
@Tran(policy = TranPolicy.nested)
public void addUser(UserModel user){
//....
throw new RuntimeException("不让你加");
}
}
@Controller
public class DemoController{
@Inject
UserService userService;
//子回滚父不回滚
//
@Tran
@Mapping("/user/add2")
pubblic void addUser2(UserModel user){
try{
userService.addUser(user);
}catch(ex){ }
}
}
- 多数据源事务示例
@Service
public class UserService{
@Db("db1")
UserMapper userDao;
@Tran
public void addUser(UserModel user){
userDao.insert(user);
}
}
@Service
public class AccountService{
@Db("db2")
AccountMappeer accountDao;
@Tran
public void addAccount(UserModel user){
accountDao.insert(user);
}
}
@Controller
public class DemoController{
@Inject
AccountService accountService;
@Inject
UserService userService;
@Tran
@Mapping("/user/add")
public void addUser(UserModel user){
userService.addUser(user); //会执行db1事务
accountService.addAccount(user); //会执行db2事务
}
}
附:Solon项目地址
- gitee: https://gitee.com/noear/solon
- github: https://github.com/noear/solon
Springboot mini - Solon详解(四)- Solon的事务传播机制的更多相关文章
- MySQL系列详解四:MySQL事务-技术流ken
MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数 ...
- Springboot mini - Solon详解(二)- Solon的核心
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Springboot mini - Solon详解(六)- Solon的校验框架使用、定制与扩展
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Springboot mini - Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Springboot mini - Solon详解(八)- Solon的缓存框架使用和定制
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Springboot mini - Solon详解(三)- Solon的web开发
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Solon详解(四)- Solon的事务传播机制
在前面的篇章里我们已经见识了 Solon 对事务的控制,及其优雅曼妙的形态.该篇将对事务的传播机制做讲解.出于对用户的学习成本考虑,Solon 借签了Spring 的事务传播策略:并友好的支持多数据源 ...
- Solon详解(六)- Solon的校验扩展框架使用与扩展
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
随机推荐
- 手把手教你5分钟从零开发一款简易的IDEA插件!项目经验/毕设不愁了!
我这个人没事就喜欢推荐一些好用的 IDEA 插件给大家.这些插件极大程度上提高了我们的生产效率以及编码舒适度. 不知道大家有没有想过自己开发一款 IDEA 插件呢? 我自己想过,但是没去尝试过.刚好有 ...
- SQL SERVER中 DBLINK的实现
不同服务器数据库之间的数据操作 --创建链接服务器 exec sp_addlinkedserver'ITSV' ,'' , 'SQLOLEDB' ,'远程服务器名或ip地址' exec sp_addl ...
- Django 配置 Mysql
先安装mysqlclient pip install mysqlclient sttings中的 DATABASES = { 'default': { 'ENGINE': 'django.db.bac ...
- Python_爬虫项目
1.爬虫--智联招聘信息搜集 原文链接 1 #-*- coding: utf-8 -*- 2 import re 3 import csv 4 import requests 5 from tq ...
- C#委托的详细总结
1.什么是委托 委托是C#中一种类型,它的作用相当于C语言中的函数指针,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用if- ...
- centos 6系统下新磁盘分区(MBR格式)
添加新磁盘后,fdisk -l查看所有磁盘列表( fdisk只能分区2T以下磁盘,超过2T的用parted命令来进行GPT分区) 然后fdisk -cu /dev/sdb选择要分区的磁盘,按m显示菜单 ...
- Vue + ElementUI 后台管理模板推荐
最近学习和项目都用到了Vue和ElementUI,自己不是专业前端,搞这些UI上的东西还是有些难度,这里推荐两个Vue + ElementUI后台管理模板 vue-element-admin vue- ...
- Java面试那些事
网址链接:https://mp.weixin.qq.com/s/BkiDwyjua4iwws7gWHwK9Q 引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试 ...
- php 序列化和反序列化的作用及使用
1.序列化是什么意思呢? 序列化就是把本来不能直接存储的数据转换成可存储的数据,并且不会丢掉数据格式 serialize(); 2.反序列化是什么意思呢? 其实就是字面的意思,把序列化的数据,转换成我 ...
- MathType如何输入微分上的点
作为被老师们青睐的公式编辑器,MathType可以帮助插入各种数学符号和编辑数学公式,从而提高数学试卷的编写效率.但是作为新手,在编辑公式的时候难免有困难,比如就有人问:如何输入微分上的点?其实也是有 ...