背景 最近发现一个有趣的命题,多线程如何保证事务的一致性,简单的说,如何保证多线程情况下,一个线程操作入库逻辑执行失败,其他线程能感知,一起回滚,一起成功 个人看法 再此之前,我是觉得不太现实,为什么呢? 我们先从理论上去推理一下。 我们都知道事务的特性是什么? 这个不难吧?八股文必背内容之一,ACID 必须张口就来: 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 那么问题又来了,你觉得如果有多线程事务,那么我们破坏了哪个特性? 多线程事务你也别想的多深奥,你就想,两个不同的用户各自发起了一个下单请求,这个请求对应的后台实现逻辑中是有事务存在的。 这不就是多线程事务吗? 这种场景下你没有想过怎么分别去控制两个用户的事务操作吧? 因为这两个操作之间就是完全隔离的,各自拿着各自的链接玩儿。 所以多个事务之间的最基本的原则是什么? 隔离性 。两个事务操作之间不应该相互干扰。 而多线程事务想要实现的是 A 线程异常了。A,B 线程的事务一起回滚。 事务的特性里面就卡的死死的。所以,多线程事务从理论上就是行不通的。 ....

Seata原理
Seata 术语 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器 定义全局事务的范围:开始全局事务、提交或回滚全局事务。 RM (Resource Manager) - 资源管理器 管理分支事务处理的资源,与 TC 交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 原理图

分布式事务seata
Seata 是什么 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。AT 模式是阿里首推的模式,阿里云上有商用版本的 GTS(Global Transaction Service 全局事务服务) 官网:https://seata.io/zh-cn/index.html 源码: https://github.com/seata/seata 官方 Demo: https://github.com/seata/seata-samples seata 版本:v1.4.0 Seata 的三大角色 在 Seata 的架构中,一共有三个角色 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器 定义全局事务的范围:开始全局事务、提交或回滚全局事务。 RM (Resource Manager) - 资源管理器 管理分支事务....

spel实现复杂权限控制
权限控制中引入 SpEL 来让复杂的权限控制变的更简单,更灵活。 博客转载: juejin.cn/post/7226674759626571833 1 前言 对于在 SpringBoot 中,利用自定义注解 + 切面来实现接口权限的控制这个大家应该都很熟悉,也有大量的博客来介绍整个的实现过程,整体来说思路如下: 自定义一个权限校验的注解,包含参数 value 配置在对应的接口上 定义一个切面类,指定切点 在切入的方法体里写上权限判断的逻辑 乍一看,没毛病,学到了,学到了~,收藏起来。但是呢,等到实际用到的时候就傻眼了,为什么呢?在实际的开发中,你会发现,对于权限校验的需求场景是很多的,比如: 只要配置了任何角色,就可以访问 有某个权限就可以访问 放行所有请求 只有超级管理员角色才可以访问 只有登录后才可以访问 在指定时间段内可以访问 有某个角色的情况下才可以访问 同时具有指定的多个角色情况下才可以访问 傻眼了不,按照上面的实现逻辑的话怎么搞?加注解?写各种判断?这时候,其实我们就可以通过 SpEL 表达式来帮我们处理这个问题。 2SpEL 表达式 本文前面提到 SpEL,那么到底 Sp....

Arthas使用
深入理解 Arthas:Java 诊断利器 在 Java 应用的生产环境中,当遇到性能问题或异常行为时,我们通常需要一套强大的工具来进行诊断和监控。Arthas,作为 Alibaba 开源的 Java 诊断工具,正是这样一个利器。它提供了丰富的命令来帮助开发者深入了解正在运行的 JVM。 什么是 Arthas? Arthas 是一个 Java 诊断工具,它提供了一系列功能强大的命令行,用于在线分析和监控 Java 应用程序。它能够帮助你解决应用运行时的各种复杂问题,如监控 JVM 的实时运行状态、查看类信息、监测方法调用和执行 SQL 语句等。 arthas 官网: https://arthas.aliyun.com/doc/ Arthas 常用命令 下面列出了一些 Arthas 里最常用的命令: dashboard:显示当前系统的实时数据面板。 thread:查看当前 JVM 的线程堆栈。 jvm:查看 JVM 的相关信息,如版本、启动参数等。 classloader:查看 JVM 类加载器的相关信息。 watch:监控方法执行情况,可以打印出方法参数值、返回值、抛出的异常等信息。 ....

手写Spring Tx
背景 手写 Spring 进行到了事务了,上 2 篇文章介绍了手写 Spring IOC,spring Aop,这篇文章在介绍手写 Spring tx 概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 Spring Framework 对事务管理提供了一致的抽象,其特点如下: 为不同的事务 API 提供一致的编程模型,比如 JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API 和 JDO(Java Data Objects) 支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用 提供比其他事务 API 如 JTA 更简单的编程式事务管理 API 与 Spring 数据访问抽象的完美集成 流程实现 从图中我们能够知道 Spring Tx 也是通过 AOP 增强,反射代理生成一个代理对象,进行对业务方法增强,处理我们的事务 有时候我们会在一个方法里面执行多个 SQL 语句,要想保证事务,必须保证这些是在同一个 connection 连接,同一个事务,这样回滚才....

手写spring AOP
背景 基于上次手写一个 mini 版的 Spring IoC,考虑把 AOP 也给接入进来 AOP 回顾 AOP 概念 AOP(Aspect Oriented Programming)是面向切面编程。是 OOP 面向对象编程思想的一种补充。 OOP 通过继承,封装,多态等概念构建一个对象的层级结构。构建的是一个纵向的关系。面对横向的问题,实现起来比较复杂,比如日志的输出。使用面向对象的思想,每个类都需要增加日志打印的相关代码。但是使用 aop 就可以很简单的解决这个问题。 aop 将影响了多个类的公共行为(如日志打印)封装为一个可重用模块,定义为一个切面(aspect)。切面中包括切入点,通知,连接点等概念。 切入点:就是需要做切面处理的位置,可以通过 @PointCut 中的 execution 值指定某个包,某个类或者某个方法。同时也可以使用自定义注解标注。 通知:包括 5 种,分别是前置,后置,返回,异常,环绕通知。分别定义增强代码执行的时机。 连接点:是可以用来做为切入点的位置。是程序执行的某个位置,可以为程序执行前,也可以是执行后或者抛出异常等一些时机点 aop 作用是降低程....