常用的网站建设技术有做外文网站

张小明 2025/12/29 12:43:05
常用的网站建设技术有,做外文网站,网站后台密码修改,怎样改变wordpress的封面一、核心前提#xff1a;两个注解的分工注解定位核心作用执行时机GlobalTransactional全局事务入口标记 “主方法”#xff0c;创建全局事务 XID#xff0c;管控整体提交 / 回滚主方法执行前TwoPhaseBusinessActionTCC 子方法标记 “Try 方法”#xff0c;绑定 Confirm/Can…一、核心前提两个注解的分工注解定位核心作用执行时机GlobalTransactional全局事务入口标记 “主方法”创建全局事务 XID管控整体提交 / 回滚主方法执行前TwoPhaseBusinessActionTCC 子方法标记 “Try 方法”绑定 Confirm/Cancel声明为 TCC 分支子方法执行时被主方法调用简单说GlobalTransactional是 “总指挥”TwoPhaseBusinessAction是 “小兵”—— 总指挥不会提前知道有哪些小兵而是小兵执行时主动向总指挥 “报到”。二、完整流程从主方法执行到子方法绑定步骤 1拦截GlobalTransactional创建全局事务主方法执行前Seata 通过GlobalTransactionalInterceptor拦截所有带GlobalTransactional的主方法核心逻辑java运行// GlobalTransactionalInterceptor.java public Object invoke(MethodInvocation invocation) throws Throwable { // 1. 检查是否有全局事务 XID首次执行时为 null String xid RootContext.getXID(); if (xid null) { // 2. 创建全局事务生成唯一 XID如127.0.0.1:8091:123456 GlobalTransaction tx GlobalTransactionContext.createNew(); // 3. 开启全局事务更新 global_table 状态为 “开始” tx.begin(/* 超时时间 */, /* 事务名称 */); // 4. 将 XID 绑定到当前线程ThreadLocal RootContext.bind(tx.getXid()); } try { // 5. 执行主方法此时会调用所有带 TwoPhaseBusinessAction 的子方法 return invocation.proceed(); } catch (Exception e) { // 6. 异常时回滚全局事务触发 Cancel 方法 GlobalTransactionContext.getCurrent().rollback(); throw e; } finally { // 7. 无异常则提交全局事务触发 Confirm 方法 if (RootContext.getXID() ! null) { GlobalTransactionContext.getCurrent().commit(); RootContext.unbind(); // 清除线程绑定的 XID } } }关键此时仅创建了全局事务 XID 并绑定到当前线程还不知道任何 TCC 子方法的存在。步骤 2拦截TwoPhaseBusinessAction注册分支事务子方法执行时当主方法执行到带TwoPhaseBusinessAction的子方法时Seata 通过TccActionInterceptor拦截该子方法核心逻辑java运行// TccActionInterceptor.java public Object invoke(MethodInvocation invocation) throws Throwable { // 1. 检查当前线程是否有全局事务 XID主方法已绑定 String xid RootContext.getXID(); if (xid null) { // 无全局事务直接执行方法非 TCC 分支仅普通方法 return invocation.proceed(); } // 2. 解析 TwoPhaseBusinessAction 注解绑定 Confirm/Cancel 方法 Method tryMethod invocation.getMethod(); TwoPhaseBusinessAction tccAnnotation tryMethod.getAnnotation(TwoPhaseBusinessAction.class); TccAction tccAction TccActionParser.parse(tryMethod); // 解析出 Try/Confirm/Cancel 方法 // 3. 注册 TCC 分支事务核心将子方法关联到全局事务 XID BranchRegistration branchReg new BranchRegistration(); branchReg.setXid(xid); branchReg.setBranchType(BranchType.TCC); branchReg.setResourceId(/* TCC 方法唯一标识类名方法名 */); branchReg.setApplicationData(/* 序列化 TccAction 对象含 Confirm/Cancel */); // 调用 Seata Server 注册分支返回分支 ID Long branchId TccResourceManager.INSTANCE.branchRegister(branchReg); try { // 4. 执行 Try 方法业务逻辑如冻结金额、预留资源 Object result invocation.proceed(); // 5. 标记分支事务“Try 阶段完成” TccResourceManager.INSTANCE.branchReport(xid, branchId, BranchStatus.PhaseOne_Done); return result; } catch (Exception e) { // 6. Try 失败标记分支状态后续全局事务会触发 Cancel TccResourceManager.INSTANCE.branchReport(xid, branchId, BranchStatus.PhaseOne_Failed); throw e; } }核心关键子方法执行时通过ThreadLocal获取主方法绑定的 XID确认自己属于哪个全局事务解析TwoPhaseBusinessAction注解将 Try/Confirm/Cancel 方法序列化后注册为 “TCC 分支事务”并写入 Seata 数据库的branch_table关联 XID此时全局事务主方法就通过branch_table知道了 “自己有哪些 TCC 子方法”。步骤 3全局事务提交 / 回滚触发二阶段方法主方法执行后当主方法执行完成无异常 / 有异常GlobalTransactional触发提交 / 回滚逻辑核心是从branch_table读取已注册的 TCC 分支java运行// DefaultGlobalTransaction.java public void commit() throws TransactionException { // 1. 根据 XID 查询所有已注册的 TCC 分支来自步骤 2 的注册 ListBranchDO branchList branchStorage.findBranchListByXid(this.xid); for (BranchDO branch : branchList) { if (branch.getBranchType() BranchType.TCC) { // 2. 反序列化 TccAction 对象获取 Confirm 方法 TccAction tccAction JSON.parseObject(branch.getApplicationData(), TccAction.class); // 3. 反射执行 Confirm 方法子方法的二阶段 invokeTargetMethod(tccAction.getConfirmMethod(), branch.getArgs()); // 4. 更新分支状态为“已提交” branchStorage.updateBranchStatus(branch.getBranchId(), BranchStatus.PhaseTwo_Committed); } } // 5. 更新全局事务状态为“已提交” globalStorage.updateGlobalStatus(this.xid, GlobalStatus.Committed); }回滚逻辑同理从branch_table读取分支执行Cancel方法。三、核心原理总结一句话说透GlobalTransactional不会 “主动扫描” 子方法的TwoPhaseBusinessAction而是主方法执行前创建全局事务 XID 并绑定到当前线程子方法执行时Seata 拦截TwoPhaseBusinessAction通过线程绑定的 XID 向全局事务 “注册自己”全局事务提交 / 回滚时从数据库读取已注册的 TCC 分支执行二阶段方法。四、关键细节避免误解线程绑定是核心桥梁XID 存储在RootContext本质是ThreadLocalString子方法和主方法在同一个线程执行因此能拿到同一个 XID这是 “关联” 的基础。非侵入式拦截无需在主方法中显式声明子方法只要子方法加TwoPhaseBusinessAction且被主方法调用就会自动注册为分支 —— 这是 Seata TCC 无侵入的关键。分支注册是持久化保障TCC 分支信息写入branch_table即使 Seata Server 宕机恢复后仍能根据 XID 找到分支方法保证二阶段执行幂等性由业务层保证。五、调试验证快速确认绑定关系断点 1GlobalTransactionalInterceptor.invoke()→ 查看 XID 的创建和绑定断点 2TccActionInterceptor.invoke()→ 查看子方法如何解析TwoPhaseBusinessAction并注册分支数据库验证执行主方法后查询branch_tablesqlSELECT xid, resource_id, application_data FROM branch_table WHERE branch_type TCC;application_data字段会序列化存储 Try/Confirm/Cancel 方法的全限定名可直接看到主方法XID和子方法的绑定关系。最终类比GlobalTransactional像 “项目经理”启动项目创建 XID后开始干活TwoPhaseBusinessAction像 “员工”干活时执行子方法主动向项目经理报到注册分支项目收尾时提交 / 回滚项目经理根据报到记录branch_table安排员工做收尾工作Confirm/Cancel。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

苏州微信网站企业门户网站代码设计

还在为浏览器下载速度慢、功能单一而烦恼?Motrix浏览器扩展将彻底改变你的下载体验!这款专为Motrix下载管理器设计的浏览器插件,通过多线程加速、跨协议支持和智能任务管理,为你带来前所未有的高效下载方式。 【免费下载链接】mot…

张小明 2025/12/26 5:35:00 网站建设

如何建立国际网站交互设计专业大学排名

LED电子看板作为实时数据展示的核心载体,通过直观呈现生产状态、产量、异常等信息,帮助管理者快速决策。本文结合安徽某材料加工厂与浙江某科技公司的实际案例,解析LED电子看板如何助力工厂实现智能生产管理。一、安徽某材料加工厂&#xff1…

张小明 2025/12/26 5:35:15 网站建设

电子商务网站策划书wordpress 英文采集

深入探索Shell编程:位置参数、循环与字符串处理 1. 位置参数的奥秘 位置参数在Shell脚本中扮演着重要角色,它允许我们在脚本执行时传递参数。例如,当我们传递 word words with spaces 作为参数时,不同的引用方式会产生不同的结果: | 引用方式 | 结果 | | ---- | ---…

张小明 2025/12/26 5:35:03 网站建设

内江网站建设最近国际局势最新消息

2023年6月英语六级真题高效备考指南 【免费下载链接】2023年6月英语六级真题下载 2023年6月英语六级真题下载 项目地址: https://gitcode.com/Open-source-documentation-tutorial/9bfd8 还在为六级考试发愁吗?📚 别担心,我们为你准备…

张小明 2025/12/26 5:35:02 网站建设

可以做软件的网站有哪些内容网站开发html5技术

目录 手把手教你学Simulink 一、引言:为什么“机器人悬停时电机持续发热、抖动甚至下滑”?——忽略重力是零力控制与柔顺作业的第一大障碍! 二、重力补偿原理:从牛顿-欧拉到拉格朗日 1. 机器人动力学方程(n自由度&a…

张小明 2025/12/26 5:35:04 网站建设

做ps从哪个网站上下载图片大小线上设计师是什么意思

FreeBSD边缘功能与问题报告指南 无盘客户端的配置与安全设置 在无盘客户端上,你可以安装所需的软件包。使用以下命令安装 sudo : # pkg -c /diskless/1/ install sudo通过这种方式,你可以安装任何需要的软件。 SSH密钥管理 无盘客户端中,主机的SSH密钥是比较麻烦的问…

张小明 2025/12/26 5:35:15 网站建设