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. 双数组字典树(Double Array Trie)

    参考文献 1.双数组字典树(DATrie)详解及实现 2.小白详解Trie树 3.论文<基于双数组Trie树算法的字典改进和实现> DAT的基本内容介绍这里就不展开说了,从Trie过来的同 ...

  2. 《GNU_makefile》第六章——变量

    makefile中的变量特征和C语言中的宏一样. 变量使用 =,:=,?= 和 define 定义 一些特殊的自动化变量:$< $@ $^ $* 1.变量的引用 通过 $(VAR) 或 ${VA ...

  3. synchronized 到底该不该用?

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  4. 记录一个处理Excel的新插件:Alibaba Easy Excel

    EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel.github地址:https://github.com/alibaba/ ...

  5. 结合实战和源码来聊聊Java中的SPI机制?

    写在前面 SPI机制能够非常方便的为某个接口动态指定其实现类,在某种程度上,这也是某些框架具有高度可扩展性的基础.今天,我们就从源码级别深入探讨下Java中的SPI机制. 注:文章已收录到:https ...

  6. 划分问题(Java 动态规划)

    Description 给定一个正整数的集合A={a1,a2,-.,an},是否可以将其分割成两个子集合,使两个子集合的数加起来的和相等.例A = { 1, 3, 8, 4, 10} 可以分割:{1, ...

  7. 为什么Redis是单线程?

    转载链接:https://cloud.tencent.com/developer/article/1120615 1)以前一直有个误区,以为:高性能服务器 一定是多线程来实现的 原因很简单因为误区二导 ...

  8. Java web项目 上传图片保存到数据库,并且查看图片,(从eclipse上移动到tomact服务器上,之路径更改,包括显示图片和导出excel)

    //项目做完之后,在本机电脑运行完全正常,上传图片,显示图片,导出excel,读取excel等功能,没有任何问题,但是,当打成war包放到服务器上时,这些功能全部不能正常使用. 最大的原因就是,本机测 ...

  9. Guitar Pro 7 中文界面的介绍

    用过Guitar Pro这款软件的小伙伴们都知道,Guitar Pro这款吉他软件因为是国外开发商研发的,所以软件最初都是英文版本,对于国内的的吉他爱好者来说,在软件使用上还是很不方便的.随着Guit ...

  10. 思维导图软件iMindMap怎么用模板制作思维导图

    随着思维导图的不断发展,市场上相关的软件也越来越多.像XMind.MindManager等.每一款软件都有它独特的亮点.作为众多思维导图软件中的一款,iMindMap算是比较亮眼的了.现在很多人都在用 ...