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项目地址

Springboot mini - Solon详解(四)- Solon的事务传播机制的更多相关文章

  1. MySQL系列详解四:MySQL事务-技术流ken

    MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数 ...

  2. Springboot mini - Solon详解(二)- Solon的核心

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  3. Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  4. Springboot mini - Solon详解(六)- Solon的校验框架使用、定制与扩展

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  5. Springboot mini - Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  6. Springboot mini - Solon详解(八)- Solon的缓存框架使用和定制

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  7. Springboot mini - Solon详解(三)- Solon的web开发

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  8. Solon详解(四)- Solon的事务传播机制

    在前面的篇章里我们已经见识了 Solon 对事务的控制,及其优雅曼妙的形态.该篇将对事务的传播机制做讲解.出于对用户的学习成本考虑,Solon 借签了Spring 的事务传播策略:并友好的支持多数据源 ...

  9. Solon详解(六)- Solon的校验扩展框架使用与扩展

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

随机推荐

  1. CentOS GRUB损坏修复方法

    前言 博客很久没有更新了,一个原因就是原来存放部署博客的环境坏了,硬盘使用的是SSD,只要读取到某个文件,整个磁盘就直接识别不到了,还好博客环境之前有做备份,最近一直没有把部署环境做下恢复,今天抽空把 ...

  2. cnblog markdown 模式下调整图片大小

    流程 上传图片,获得图片链接,例如 ![](https://img2020.cnblogs.com/blog/2163507/202010/2163507-20201030205035211-7968 ...

  3. 最多约数问题(Java)

    Description 正整数x 的约数是能整除x 的正整数.正整数x的约数个数记为div(x).例如,1,2,5,10 都是正整数10的约数,且div(10)=4.设a 和b是2 个正整数,a≤b, ...

  4. java 连接sqlserver

    db.properties 文件 driver=com.microsoft.sqlserver.jdbc.SQLServerDriver url=jdbc:sqlserver://10.1.1.19: ...

  5. Android ALSPS驱动分析

    一.alsps的初始化函数和重要结构体 epl2182_init // Epl2182.c (kernel-3.10\drivers\misc\mediatek\alsps\epl2182-new) ...

  6. Ayoa:麻雀虽小、五脏俱全的思维导图工具

    Ayoa是一款简单好用的思维导图软件,在PC端可以使用Ayoa网页版,也就是不用下载即可使用,十分轻便省力.但麻雀虽小,五脏可十分俱全,同类的其他大型软件有的东西它可一点不少,甚至还有更多的特殊功能. ...

  7. {"non_field_errors":["Unable to log in with provided credentials."]}% 无法使用提供的凭据登录

    在使用rest_framework_jwt进行登陆验证获取token的时候会报 {"non_field_errors":["Unable to log in with p ...

  8. java基础之一:基本数据类型

    在java中有基本数据类型和引用类型两种,今天来说下基本数据类型和其对应的包装类的之间的关系. 一.概述 java中的基本数据类型有八种,分别是char.byte.short.int.long.flo ...

  9. 怎么用Iometer测试存储性能

    1.Disk Targets选项栏中选择要测试的磁盘,1 per target of Outstanding I/Os 保持默认即可. 2.在Access Specifications栏中新建测试条件 ...

  10. 腾讯云 CHDFS — 云端大数据存算分离的基石

    随着网络性能提升,云端计算架构逐步向存算分离转变,AWS Aurora 率先在数据库领域实现了这个转变,大数据计算领域也迅速朝此方向演化. 存算分离在云端有明显优势,不但可以充分发挥弹性计算的灵活,同 ...