ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Seata 1.6.0 版本详解:新特性、关键修复与 AT 模式底层演进

Seata 1.6.0 版本详解:新特性、关键修复与 AT 模式底层演进 后端微服务【免费下载链接】incubator-seata:fire: Seata is an easy-to-use, high-performance, open source distributed transaction solution.项目地址https://gitcode.com/gh_mirrors/in/incubator-seata点击查看免费下载本文基于 changes/zh-cn/1.6.0.md 展开围绕 Seata 1.6.0 发布说明中的 feature、bugfix、optimize、test 四类变更逐项解析其业务价值与源码实现依据。读完本文你将掌握该版本的核心能力边界如多注册中心、多主键、JDK17、update join 联表更新等理解 InsertOnDuplicateUpdate 系列修复背后的前后镜像机制以及升级到 1.6.0 时值得关注的兼容性与配置要点。版本概览Seata 1.6.0 带来了什么Seata 1.6.0 是 Seata 分布式事务解决方案在 1.6 系列的第一个正式版本定位为特性增强 大规模缺陷收敛的里程碑版本。本次发布共包含 9 项 feature、34 项 bugfix、24 项 optimize 以及 3 项测试相关改动覆盖 AT 模式 SQL 解析与前后镜像、TCC 模式注解语义、Server 端注册中心与存储、XA 模式连接处理、客户端 SDK 与构建链等多个层面。从变更重心看1.6.0 有三个明显主题数据库兼容性纵深Oracle/PostgreSQL 多主键、Oracle timestamp/nclob、MySQL update join 与 InsertOnDuplicateUpdate 系列问题集中修复接入生态扩展支持 Apache Dubbo3、Nacos contextPath、JDK17 客户端、Docker arm64 镜像Server 可用性治理多注册中心、注册中心重启后 accessKey 丢失修复、XA 连接状态回滚修复。以下按发布说明的四类条目逐一展开。Feature 详解九大新特性与源码实现支持 Oracle 和 PostgreSQL 多主键在 1.6.0 之前AT 模式对多主键表的支持主要面向 MySQL本次更新PR #4863将多主键能力扩展到了 Oracle 和 PostgreSQL使得这两类数据库下基于多个主键列生成前后镜像、构建锁定键lock key与执行回滚 SQL 的行为与 MySQL 对齐。从源码结构看AT 模式的前后镜像查询与锁键构建统一收敛在 BaseTransactionalExecutor 中其中buildLockKey(TableRecords rowsIncludingPK)在 1.6.0 中还专门做了可读性重构见下文 optimize 部分多主键支持的本质是让 SQL 解析器识别出多个主键列构成的行唯一性并据此拼接where pk1 ? and pk2 ?形式的镜像查询条件。seata-server 支持多注册中心PR #4649 为 seata-server 引入了多注册中心能力即一个 Server 实例可同时注册到多个注册中心如 Nacos Consul客户端任选其一即可发现服务适合多机房、多注册中心共存的过渡期或容灾场景。源码层面该能力由 MultiRegistryFactory 实现它读取registry.type配置通过Constants.REGISTRY_TYPE_SPLIT_CHAR分隔符切分多个类型名再借助EnhancedServiceLoader按RegistryProvider逐个加载并实例化对应RegistryService最终返回实例列表ListRegistryService。配置示例registry { # 多注册中心多个类型用分隔符隔开 type nacos,consul ... }单注册中心场景则仍走 RegistryFactory两者读取同一registry.type配置项。当前 RegistryType 枚举支持的注册中心类型包括File、Raft、ZK、Redis、Nacos、Eureka、Consul、Etcd3、Sofa、Custom以及Seatanamingserver。支持 Apache Dubbo3PR #4779 为 Seata 的 Dubbo 集成新增了 Apache Dubbo3org.apache.dubbo支持与既有的seata-dubbo-alibabacom.alibaba.dubbo并存。仓库中 extensions/rpc 模块下新增了seata-dubbo目录内含 Dubbo3 的集成配置与扩展实现而 extensions/rpc/seata-dubbo-alibaba 继续服务 Alibaba Dubbo 用户。这意味着使用 Dubbo3 的微服务应用可以原生接入 Seata 的全局事务拦截无需改造 RPC 框架。TCC 注解支持添加在接口和实现类上PR #4479 放宽了 TCC 模式TwoPhaseBusinessAction等注解的标注位置此前注解一般要求落在实现类方法上1.6.0 起允许同时标注在接口方法与实现类方法上提升了与既有代码风格的兼容性——尤其是那些在接口上统一声明业务契约、在实现类中完成业务逻辑的工程。对应逻辑位于 tcc 模块的注解解析与代理构建中解析时会按实现类优先、接口兜底的策略定位两阶段方法。client SDK 支持 JDK17PR #4877 让 Seata 客户端 SDK 可以在 JDK 17 运行时环境下正常工作。该项改动同时伴随着多条与 JDK 兼容性相关的修复例如 PR #4874OpenJDK 11 启动失败、PR #5163高版本 JDK 编译失败共同保证了从 JDK8 到 JDK17 的平滑过渡。需要注意的是该支持针对的是client SDK 运行与编译Server 端运行环境的 JDK 选择仍建议以官方部署文档为准。支持 MySQL update join 联表更新语法PR #4914 为 AT 模式补上了 MySQLUPDATE ... JOIN ...联表更新语法的支持。此前此类 SQL 无法被正确识别与拦截1.6.0 在 SQL 解析层新增了对应执行器 MySQLUpdateJoinExecutor它继承自UpdateExecutor负责对联表更新生成正确的前后镜像与 undo log。支持 Oracle timestamp 类型PR #4542 使 AT 模式支持 Oracle 的TIMESTAMP类型字段。在此之前timestamp 类型在镜像比对、值序列化环节可能被当作字符串或无法正确比对导致回滚数据不一致1.6.0 起在类型处理层将 timestamp 纳入支持范围。支持 Nacos contextPath 配置PR #5111 允许通过配置为 Nacos 注册中心指定contextPath适配 Nacos 部署在反向代理或自定义上下文路径下的场景。在 NacosRegistryServiceImpl 中contextPath 的取值顺序为系统属性优先其次读取registry.nacos.contextPath配置配置存在时写入 Nacos 客户端Properties的contextPath属性。对应配置键的拼装见 getNacosContextPathKey即registry.nacos.contextPath。Dockerfile 支持 arm64PR #4802 为 seata-server 的 Docker 镜像构建链路增加了 ARM64 架构支持并配套新增 ARM64 CI 流水线PR #4963使seataio/seata-server镜像可以在 Apple Silicon 等 ARM 平台直接运行。构建配置位于 distribution/docker。Bugfix 解析围绕 AT 模式前后镜像的密集修复1.6.0 的 bugfix 清单高度集中于MySQL InsertOnDuplicateUpdate 语句与update join这两类 SQL 在 AT 模式中会触发前镜像查询条件构造参数占位符计算后镜像查询锁键构建等一系列复杂逻辑也是 1.6.0 修复的重灾区。InsertOnDuplicateUpdate 系列问题约 10 项INSERT ... ON DUPLICATE KEY UPDATE以下简称 IODKU是 MySQL 特有的写冲突语义AT 模式要将其正确纳入全局事务必须先在执行前查询受影响行的前镜像。1.6.0 针对该语句的修复包括PR修复内容影响#4912IODKU 列名大小写不一致时无法匹配前后镜像列映射正确性#4953IODKU 可绕过修改主键的拦截防止通过 IODKU 篡改主键#5028insert 值中的 null 被解析成字符串null 值处理#5031不应使用 null 索引值作为镜像查询条件前镜像查询正确性#5032条件参数填充位置计算错误导致镜像查询 SQL 异常占位符绑定#5033SQL 中无插入列字段时空指针空列场景兜底#5075无法拦截无主键和唯一索引的 IODKU SQL拦截完备性#4995后置镜像查询 SQL 中重复的主键查询条件后镜像查询去重#5078无主键和唯一键的 SQL 无法拦截拦截完备性上述修复的落点集中在 MySQLInsertOnDuplicateUpdateExecutor该类标注为LoadLevel(name JdbcConstants.MYSQL, scope Scope.PROTOTYPE)即按 MySQL 方言加载。它通过isUpdateFlag区分新增与冲突更新两条路径并动态拼接selectSQL作为前后镜像的查询条件条件取唯一索引。同一执行器在 mariadb 与 polardbx 方言下也有对应实现。update join 相关修复与联表更新特性配套1.6.0 修复了两处 update join 缺陷PR #5004修复 update join 场景下行数据重复导致前镜像/后镜像记录重复的问题PR #5052修复 update join 条件中占位符参数?与真实参数绑定错位的问题。这两项直接影响 MySQLUpdateJoinExecutor 在执行UPDATE t1 JOIN t2 ...时的镜像数据保真度。undo log 与回滚正确性PR #4985修复 undo_log id 重复问题避免并发/重试场景下 undo log 主键冲突PR #4838修复使用Statement.executeBatch()批量执行时无法生成 undo log 的问题PR #5051回滚时若检测到 undo log 对应的数据被脏写抛出BranchRollbackFailed_Unretriable异常并停止重试——避免脏写数据下无限重试造成更大的数据不一致。事件、指标与 Server 状态PR #4780修复超时回滚成功后无法发送TimeoutRollbacked事件PR #4533修复handleRetryRollbacking事件重复导致指标数据不准确PR #4919修复 XID 的 port 与 address 在coordinator.init前出现null:0的问题PR #4928修复rpcContext.getClientRMHolderMap空指针PR #4860修复 Server 端 metrics tag 覆盖问题。连接池与数据源代理PR #5131修复 XA 连接处于 active 状态时无法回滚的问题PR #5134修复 HikariDataSource 自动代理在某些情况下失效的问题PR #5104optimize 类ConnectionProxy脱离对 Druid 的依赖使数据源代理不再强绑定特定连接池PR #5098Druid 禁用 Oracle implicit cache规避 Oracle 隐式游标缓存导致的连接状态问题。配置与启动类修复PR #4915修复获取不到ServerRecoveryProperties属性的问题PR #5093 / #5097修复 seata-server 重启后 accessKey 丢失问题两次提交分别针对不同路径PR #5018修复启动脚本中 loader path 使用相对路径导致 Server 启动失败的问题PR #4874修复 OpenJDK 11 启动失败PR #4817修复高版本 Spring Boot 配置不标准的问题PR #5092修复 Seata 与 JPA 共用时 AutoConfiguration 顺序不正确的问题PR #5109修复 RM 侧未加GlobalTransactional时报 NPE 的问题——该修复降低了误用场景下的崩溃率但正确用法仍应在事务入口标注GlobalTransactional。序列化与 TCC/SagaPR #4978修复 Kryo 序列化对循环引用的支持PR #4543修复对 OracleNCLOB数据类型的支持PR #5038修复SagaAsyncThreadPoolProperties冲突问题PR #5050修复 Saga 模式下全局状态未正确更改为Committed的问题。Optimize 解析性能、运维与工程治理性能与锁PR #4681优化全局事务中竞争锁的检查过程降低锁竞争开销PR #4761RedisLocker 中使用hget替代hmget仅需单个字段减少网络与内存开销PR #4750优化 AT 分支释放全局锁时不再使用 xid减少锁释放的依赖条件PR #4946获取锁时遇到的 SQL 异常直接传递给客户端提升问题可诊断性PR #4974取消 Redis 模式下查询 globalStatus 数量的限制PR #4582Redis 存储模式支持按超时时间排序sorted set优化超时事务的扫描顺序PR #4445优化事务超时判断逻辑PR #4958超时事务不再执行triggerAfterCommit()避免超时后误提交后置回调。连接与镜像PR #4765MySQL 8.0.29 及以上版本XA 模式不再将 connection 持有至二阶段释放连接资源PR #4836优化BaseTransactionalExecutor#buildLockKey(TableRecords rowsIncludingPK)方法可读性PR #5104ConnectionProxy移除对 Druid 的依赖见上文。构建、发布与安全PR #4774 / #4962优化seataio/seata-server镜像中的 MySQL8 依赖与基础镜像PR #4790新增自动发布到 OSSRH 的 GitHub ActionPR #4807优化 Docker 镜像与 OSS 仓库发布流水线PR #4797优化全部 GitHub Actions 脚本PR #4963新增 ARM64 CI 流水线PR #4800添加 NOTICE 文件Apache License V2 合规要求PR #4865 / #4921 / #4917修复 Saga 可视化设计器 GGEditor、控制台模块的安全漏洞并升级依赖PR #4911添加 header 与 license 检测工作流。依赖与代码治理PR #4414移除 log4j 依赖PR #4468支持 Kryo 5.3.0PR #4932抽取部分配置的默认值减少重复硬编码PR #4936优化存储配置的读取PR #4924 / #4925 / #5047优化 pom 依赖、javadoc 注释、移除无用代码PR #4490TCC fence 记录表优化为按索引删除提升清理效率PR #4981优化 TCC fence 记录查不到时的错误提示PR #5124支持 Oracle 删除 TCC fence 记录表PR #4434移除 seata-server 的 CMS GC 参数CMS 已在 JDK14 被移除此举适配高版本 JDK。Test 与质量保障1.6.0 的测试工作聚焦在数据库兼容性验证上PR #4411新增 Oracle 数据库 AT 模式下类型支持的单元测试PR #4794重构并尝试修复DataSourceProxyTest.getResourceIdTest()PR #5101修复 ZK 注册与配置中心测试中的ClassNotFoundException。配合 ARM64 CI 流水线PR #49631.6.0 形成了多数据库MySQL/Oracle/PostgreSQL 多架构x86/ARM 多注册中心的测试矩阵雏形。升级与使用建议关注 InsertOnDuplicateUpdate 与 update join 行为变化如果业务大量使用 MySQL IODKU 或联表更新1.6.0 修复了该路径下前后镜像的多处缺陷升级后事务拦截行为会更严格例如无主键/唯一索引的 IODKU 将被拦截需结合 MySQLInsertOnDuplicateUpdateExecutor 的行为提前梳理存量 SQL多注册中心配置若需同时注册到多个注册中心将registry.type配置为以分隔符连接的多个类型如nacos,consul参考 MultiRegistryFactory 的加载逻辑Nacos 部署在自定义上下文路径时配置registry.nacos.contextPath即可适配JDK 版本1.6.0 客户端 SDK 支持至 JDK17且修复了 OpenJDK11 启动与高版本 JDK 编译问题升级 JDK 的阻力显著降低回滚行为变化undo log 脏写将抛出不可重试异常PR #5051运维侧应关注回滚失败日志中该异常的出现它意味着业务数据已被外部修改需人工介入而非依赖自动重试。总结Seata 1.6.0 是一次兼容性补全 稳定性收敛的典型版本新特性聚焦数据库方言Oracle/PostgreSQL 多主键、MySQL update join、Oracle timestamp与接入生态Dubbo3、Nacos contextPath、JDK17、ARM64修复与优化则系统性地清除了 AT 模式在 IODKU、update join 等高频复杂 SQL 上的前后镜像缺陷并同步治理了 Server 端的事件、指标、存储与构建链路。对于使用 MySQL 写冲突语义、联表更新或运行于多注册中心/多架构环境的 Seata 用户1.6.0 具备明确的升级价值。赞分享后端微服务【免费下载链接】incubator-seata:fire: Seata is an easy-to-use, high-performance, open source distributed transaction solution.项目地址https://gitcode.com/gh_mirrors/in/incubator-seata点击查看免费下载相关推荐Seata 2.0.0 版本发布详解分布式事务新特性、关键修复与升级实践指南Seata 2.0.0 版本发布详解分布式事务新特性、关键修复与升级实践指南 Seata 2.0.0 是 Seata 分布式事务解决方案在 2.x 时代的首个后端微服务Sphinx 1.2 版本演进全解析从 1.2 beta1 到 1.2.3 的关键特性与修复Sphinx 1.2 版本演进全解析从 1.2 beta1 到 1.2.3 的关键特性与修复 本篇技术指南以 Sphinx 仓库中 doc/changes/1文档开发工具esbuild 版本演进指南从 CHANGELOG 解读 0.28.x 的关键修复、安全加固与新特性esbuild 版本演进指南从 CHANGELOG 解读 0.28.x 的关键修复、安全加固与新特性 esbuildAn extremely fast bu构建工具前端上一篇纯前端PPTX转HTML如何在浏览器中实现Office文档的零服务器解析下一篇SkyWalking 渐进式 TTLProgressive TTL实践指南基于 BanyanDB 的分层数据保留策略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表