seata简介
Seata 分布式事务模式全解析:AT、TCC、Saga、XA 本文深度解析阿里开源的分布式事务框架 Seata 支持的四种事务模式,涵盖核心原理、适用场景和性能对比,助您做出最佳技术选型。 一、AT 模式(Auto Transaction)1.1 核心原理12-- 数据更新示例UPDATE product SET stock = stock - 10 WHERE id = 1; 两阶段优化:第一阶段直接提交本地事务并生成逆向 SQL(undo log),第二阶段异步删除日志或执行补偿 全局锁机制:通过 TC(事务协调器)管理行级全局锁,防止脏写 1.2 工作流程1.3 适用场景 ✅ 常规电商业务(订单、库存) ✅ 基于关系型数据库的微服务架构 ✅ 最终一致性要求的业务场景 1.4 优缺点 优点 缺点 无代码侵入 仅支持 SQL 数据库 自动生成补偿逻辑 全局锁可能引发性能瓶颈 快速失败机制 需处理数据镜像校验问题 二、TCC 模式(Try-Confirm-Cancel)2.1 核心原理123456789public interface...
单例模式
单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方式,每种方式都有其优缺点,特别是在并发环境下。以下是几种常见的单例模式实现方式及其并发问题的解决方案: 1. 饿汉加载(Eager Initialization)123456789public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; }} 优点: 实现简单。 线程安全,无需额外的同步机制。 缺点: 实例在类加载时创建,可能会浪费资源,尤其是当实例化成本较高且实际使用频率较低时。 并发问题: 由于实例在类加载时创建,不存在并发问题。 2. 懒汉加载(Lazy...
分布式事务seata测试用例
分布式事务seata测试用例项目地址:https://gitee.com/weicj0426/demo-seata下载项目后按照如下操作 一、新建数据库数据库初始化脚本(这里使用的是mysql8):./db 目录下,数据库字符集:utf8mb4 ,排序规则:utf8mb4_general_ci 创建数据库:seata 并执行 db/seata.sql 脚本 创建数据库:seata_account 并执行 db/seata_account.sql 脚本 创建数据库:seata_order 并执行 db/seata_order.sql 脚本 创建数据库:seata_storage 并执行 db/seata_storage.sql 脚本 二、启动nacos服务在 nacos-2.1 目录下 进入 nacos/bin 目录,执行startup.sh启动nacos服务 1.\startup.cmd -m standalone 三、启动seata服务 进入 seata/conf 目录下...
java开发常用设计模式
在 Java 开发中,设计模式是解决常见问题的经典方案。以下是 Java 开发中常用的设计模式,结合实际应用场景和代码示例进行说明: 一、创建型模式1. 单例模式 (Singleton Pattern) 用途:确保一个类只有一个实例,并提供全局访问点。 场景:数据库连接池、线程池、配置管理类。 示例: 123456789101112public class Singleton { private static Singleton instance; private Singleton() {} // 私有构造函数 public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }} 2. 工厂模式 (Factory...
设计模式的六大原则
设计模式的六大原则是面向对象设计的基石,它们指导我们如何编写可维护、可扩展和灵活的代码。以下是六大原则的详细说明和示例: 1. 单一职责原则 (Single Responsibility Principle, SRP) 定义:一个类应该只有一个引起它变化的原因,即一个类只负责一项职责。 优点:降低类的复杂度,提高可读性和可维护性。 示例: 1234567891011121314151617181920212223// 违反SRP的示例class User { public void login(String username, String password) { // 登录逻辑 } public void saveToDatabase(User user) { // 数据库保存逻辑 }}// 符合SRP的示例class User { public void login(String username, String password) {...
缓存一致性问题
Java 项目中如何保证缓存一致性在 Java 项目中保证缓存一致性是一个复杂但关键的问题,尤其是在高并发场景下。以下是常见的解决方案和最佳实践,结合策略分类和具体实现示例。 一、核心策略分类1. 旁路缓存模式(Cache-Aside)123456789101112131415// 读操作示例public Data getData(String key) { Data data = cache.get(key); if (data == null) { data = db.load(key); cache.put(key, data); // 可能存在问题(见后文优化) } return data;}// 写操作示例public void updateData(String key, Data newData) { db.update(key, newData); cache.delete(key); // 先更新DB再失效缓存} 2....
npm install 依赖冲突
通过增加参数–legacy-peer-deps解决npm install –legacy-peer-deps 参数详解npm install --legacy-peer-deps 是一个 npm 命令选项,用于在安装依赖时启用对旧版 peerDependencies 的支持。这个选项主要用于解决在较新版本的 npm 中,peerDependencies 行为改变导致的兼容性问题。 1. peerDependencies 的背景peerDependencies 是 npm 中的一种依赖类型,用于声明一个包依赖于其他包的特定版本,但这些依赖不会自动安装。它们通常用于插件或库,这些插件或库需要与宿主项目中的其他包一起工作。 例如,一个插件可能需要与特定版本的框架一起工作,但它不会自动安装这个框架,而是依赖于宿主项目已经安装了这个框架。 2. --legacy-peer-deps 的作用在 npm 7 及更高版本中,peerDependencies 的行为发生了变化。默认情况下,npm 会自动安装...
gitHub代码提交不上去
已经开启科学上网的情况下 github提交代码因网络问题失败 windows下处理方法在hosts文件中增加一行(位置:C:\Windows\System32\drivers\etc) 1140.82.116.3 github.com
Nginx限流处理
limit_req_zone 是 Nginx 中用于限制请求速率的功能,常用于防止 DDoS 攻击或流量过载。以下是如何配置和测试 limit_req_zone 的详细步骤: 配置 limit_req_zone在 Nginx 配置文件中(通常是 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf),添加限流配置。 定义限流区域在 http 块中定义一个限流区域: 123456789101112131415http { # 定义限流区域,名为 "one",大小为 10MB,速率限制为每秒 1 个请求 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { listen 8090; server_name localhost; location / { ...
Unity LineRenderer 组件
Unity LineRenderer 组件使用LineRenderer 是 Unity 中用于绘制线条的组件,常用于绘制路径、轨迹、激光、圆形等效果。本文将详细介绍 LineRenderer 的使用方法。 基本概念LineRenderer 通过设置一系列顶点(positions)来绘制线条。每个顶点是一个 Vector3 坐标,线条的宽度、颜色和材质可以通过属性进行设置。 添加 LineRenderer 组件方法 1:通过代码添加123456789101112131415using UnityEngine;public class LineRendererExample : MonoBehaviour{ void Start() { // 添加 LineRenderer 组件 LineRenderer lineRenderer = gameObject.AddComponent<LineRenderer>(); // 设置 LineRenderer 属性 ...