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

一、为什么要有传播机制?

Solon 的事务是基于 aop 实现的,用者不用关心事务的开始、提交、回滚,只需要在方法上加 @XTran 注解。因为看不到内部情况,所以也会有些疑问:

  • 场景一:方法A调用了方法B,但两个方法都有事务,这个时候如果方法B异常:

    • 是让方法B回滚,还是两个一起回滚?
  • 场景二:方法A调用了方法B,但是只有方法A加了事务:
    • 是否让方法B也加入方法A的事务?
    • 如果方法B异常,是否回滚方法A?
  • 场景三:方法A调用了方法B,两者都有事务,方法B已经正常执行完:
    • 但方法A异常,是否需要回滚方法B的数据?

这个时候事务的传播机制和策略就派上用场了。

二、传播机制生效条件与特点!

基于 aop 来代理事务控制的方案 ,大都是针对于接口或类的之间调用才起效的;所以在同一个类中两个方法之间的调用,传播机制是无效的。了解这一点很重要,不然容易出乌龙事件。

  • 特点1:Solon 的事务传播策略与Spring差不多(出于对新用户的学习成本考虑)
  • 特点2:Solon 可方便的支持多数据源事务
  • 特点3:Solon 可方便支持分库框架或中间件的事务

三、传播机制的策略

下面的类型都是针对于被调用方法来说的,理解起来要想象成两个 service 方法的调用才可以。

传番策略 说明
@XTran(group=true) 如果当前没有事务组,则新建一个事务组;可用于管理多数据源事务,但不会建立链接
@XTran(policy=TranPolicy.required) 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。也是默认。
@XTran(policy=TranPolicy.requires_new) 新建事务,如果当前存在事务,把当前事务挂起。
@XTran(policy=TranPolicy.nested) 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与required类似的操作。
@XTran(policy=TranPolicy.mandatory) 使用当前的事务,如果当前没有事务,就抛出异常。
@XTran(policy=TranPolicy.supports) 支持当前事务,如果当前没有事务,就以非事务方式执行。
@XTran(policy=TranPolicy.not_supported) 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
@XTran(policy=TranPolicy.never) 以非事务方式执行,如果当前存在事务,则抛出异常。
  • 补充1:如果当前为事务组,required 和 nested 策略的事务,会自动加入事务组
  • 补充2:group=true 有时候可当 required 用
  • 补充3:一般最常用的是 @XTran(group = true) 和 @Tran 的组合使用

四、XTran 属性说明

属性 说明
value 数据源标识
policy 事务策略
group 是否为事务组;用于管理下属的子事务

五、示例

  • 父回滚,子回滚
@XService
public class UserService{
@XTran
public void addUser(UserModel user){
//....
}
} @XController
public class DemoController{
@XInject
UserService userService; //父回滚,子回滚
//
@XTran(group = true)
@XMapping("/user/add")
pubblic void addUser(UserModel user){
userService.addUser(user);
throw new RuntimeException("不让你加");
} //父回滚,子回滚
//
@XTran
@XMapping("/user/add2")
pubblic void addUser2(UserModel user){
userService.addUser(user);
throw new RuntimeException("不让你加");
}
}
  • 父回滚,子不回滚
@XService
public class UserService{
@XTran(policy = TranPolicy.requires_new)
public void addUser(UserModel user){
//....
}
} @XController
public class DemoController{
@XInject
UserService userService; //父回滚,子不回滚
//
@XTran(group = true)
@XMapping("/user/add")
pubblic void addUser(UserModel user){
userService.addUser(user);
throw new RuntimeException("不让你加;但还是加了:(");
} //父回滚,子不回滚
//
@XTran
@XMapping("/user/add2")
pubblic void addUser2(UserModel user){
userService.addUser(user);
throw new RuntimeException("不让你加;但还是加了:(");
}
}
  • 子回滚父不回滚
@XService
public class UserService{
@XTran(policy = TranPolicy.nested)
public void addUser(UserModel user){
//....
throw new RuntimeException("不让你加");
}
} @XController
public class DemoController{
@XInject
UserService userService; //子回滚父不回滚
//
@XTran(group = true)
@XMapping("/user/add")
pubblic void addUser(UserModel user){
try{
userService.addUser(user);
}catch(ex){ }
} //子回滚父不回滚
//
@XTran
@XMapping("/user/add2")
pubblic void addUser2(UserModel user){
try{
userService.addUser(user);
}catch(ex){ }
}
}
  • 多数据源事务示例
@XService
public class UserService{
@XTran("db1")
public void addUser(UserModel user){
//....
}
} @XService
public class AccountService{
@XTran("db2")
public void addAccount(UserModel user){
//....
}
} @XController
public class DemoController{
@XInject
AccountService accountService; @XInject
UserService userService; @XTran(group = true)
@XMapping("/user/add")
pubblic void addUser(UserModel user){
userService.addUser(user); //会执行db1事务 accountService.addAccount(user); //会执行db2事务
}
}

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

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

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

  2. Springboot mini - Solon详解(四)- Solon的事务传播机制

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

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

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

  4. Solon详解(二)- Solon的核心

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

  5. Solon详解(三)- Solon的web开发

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

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

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

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

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

  8. Solon详解(九)- 渲染控制之定制统一的接口输出

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

  9. Solon详解(十)- 怎么用 Solon 开发基于 undertow jsp tld 的项目?

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

随机推荐

  1. 【vagrant】第一次安装添加box报错:The box failed to unpackage properly....

    报错信息 The box failed to unpackage properly. Please verify that the box file you're trying to add is n ...

  2. 数据结构C语言实现----树

    树的基本知识点 树的定义 树的ADT(抽象数据类型) 树的储存结构 二叉树的定义 二叉树的储存结构 遍历二叉树 二叉树的建立 二叉树的ADT typedef struct BiTNode { Elem ...

  3. 总结HashMap实现原理分析

    一.底层数据结构在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的键值对会被放在同一个位桶里,当桶中元素较多时,通过key值查找的效率较低. 而JD ...

  4. __getattribute__小例子

    class student(object): def __init__(self,name=None,age=None): self.name = name self.age = age def __ ...

  5. Python exec 内置语句

    描述 exec 执行储存在字符串或文件中的Python语句,相比于 eval,exec可以执行更复杂的 Python 代码.岭组词  https://www.cgewang.com/post/2205 ...

  6. PHP soundex() 函数

    实例 计算 "Hello" 的 soundex 键: <?php高佣联盟 www.cgewang.com$str = "Hello";echo sound ...

  7. Skill 脚本演示 ycChangeViaNumber.il

    https://www.cnblogs.com/yeungchie/ ycChangeViaNumber.il 使用鼠标滚轮快速修改 Via 的数量. 回到目录

  8. zabbix监控配置一般流程

    目录 zabbix监控配置流程 1. 配置客户端 2. 配置监控 2.1 创建主机组 2.2 添加主机并加入主机组 2.3 添加监控项 2.3.1 模板的方式(不用添加触发器) 2.3.2 手动添加的 ...

  9. 记录一次jmeter脚本开发缺少utf-8惹的祸

    背景:需要模拟余额发放,并进行大批量的发放,我就想到了jmeter.就是几个简单的接口,我想很简单,就上手,没想到最后鸡鸡,害我查了半天原因. 操作:我编写的脚本: 请求默认值的内容编码我也是为空,当 ...

  10. Armv8-A Memory management

    本文介绍Armv8-A的内存管理.内存管理指的是在系统中,内存访问是如何实现的. 使用内存管理机制,可以让每个应用之间的内存地址分离,即sandbox application,也可以让多个在物理内存上 ...