正规网站开发公司在手机上编程的软件

pingmian/2026/1/22 1:28:36/文章来源:
正规网站开发公司,在手机上编程的软件,自己做的网站能卖么,专业的移动网站建设公司排名前言这篇文章将给大家介绍一下对分布式事务的一些见解#xff0c;并讲解分布式事务处理框架 TX-LCN 的执行原理#xff0c;错误之处望各位不吝指正。1. 什么情况下需要使用分布式事务#xff1f;使用的场景很多#xff0c;先举一个常见的#xff1a;在微服务系统中#x…前言这篇文章将给大家介绍一下对分布式事务的一些见解并讲解分布式事务处理框架 TX-LCN 的执行原理错误之处望各位不吝指正。1. 什么情况下需要使用分布式事务使用的场景很多先举一个常见的在微服务系统中如果一个业务需要使用到不同的微服务并且不同的微服务对应不同的数据库。打个比方电商平台有一个客户下订单的业务逻辑这个业务逻辑涉及到两个微服务一个是库存服务(库存减一)另一个是订单服务(订单数加一)示意图如下如果在执行这个业务逻辑时没有使用分布式事务当库存与订单其中一个出现故障时就很可能出现这样的情况库存数据库的值减少了 1但是订单数据库没有变化或是库存没变化多了一个订单也就是出现了数据不一致现象。所以在类似的场合下我们要使用分布式事务保证数据的一致性。2. 分布式事务的解决思路2.1引入MySQL 中的两阶段提交策略在谈分布式事务的解决思路之前我们先来看看单一数据源是如何做事务处理的我们可以从中获取一些启发。我们以 MySQL 的 InnoDB 引擎为例由于 MySQL 中有两套日志机制一套是存储层的 redo log另一套是 server 层的 binlog每次更新数据都要对两个日志进行更新。为了防止写日志时只写了其中一个而没有写另外一个MySQL 使用了一个叫两阶段提交的方式保证事务的一致性。具体是这样的假设创建一个这样的数据库mysql create table T(ID int primary key, c int); 然后执行一条这样的更新语句mysql update T set cc1 where ID2;这条更新语句的执行流程是这样子的首先执行器会找引擎取 ID2 这一行数据拿到数据后会把数据进行1 操作然后调用引擎接口把新数据写入引擎将数据更新到内存中并将操作记录到 redo log 里此时 redo log 处于 prepare 状态。但它不会提交事务只是通知执行器已经完成任务可以随时提交。执行器生成这个操作的 binlog并把 binlog 写入磁盘最后执行器调用引擎的事务接口把 redo log 改为提交状态更新完成。在上述过程中redo log 写完后没有直接提交而是处于 prepare 状态等通知执行器并把 binlog 写完后redo log 再进行提交。这个过程就是两阶段提交这是一个精妙的设计。可能你会问为什么要有两阶段提交如果不采用两阶段提交的话也就是使用一阶段提交那就相当于按顺序执行写 redo log 和 binlog如果写完 redo log 后系统出现了故障那么就会只有 redo log 记录了操作binlog 没有记录造成数据不一致使用两阶段提交的话假设写完 redo log 后系统出现了故障由于事务还没有提交所以可以顺利回滚。两阶段提交的设计还有什么好处首先要奠定一个概念一个操作执行的时间越长这个操作就越有可能失败。打个比方你吃饭要用 20 分钟上厕所要用 1 分钟在吃饭的过程中收到微信消息的概率肯定比去上厕所的过程中收到微信消息的概率大。由于在数据库中更新操作的时间要远大于提交事务的时间所以先把更新操作做完等所有耗时操作都做完最后再提交事务能够最大程度保证事务执行成功。2.2分布式事务的两阶段提交策略根据上述的两阶段提交策略分布式事务也可以采取类似的办法完成事务。在第一阶段我们要新增一个事务管理者的角色通过它来协调各个数据源。还是拿开头的订单案例讲解在执行下订单的逻辑时先让各个数据库去执行各自的事务比如从库存中减 1在订单库中加 1但是完成后不提交只是通知事务管理者已经完成了任务。到了第二阶段由于在阶段一我们已经收到了各个数据源是否就绪的信息只要有一个数据源没有就绪在第二阶段就通知所有数据源回滚如果全部数据源都已经就绪就通知所有数据源提交事务。总结一下这个两阶段提交的过程就是首先事务管理器通知各个数据源进行操作并返回是否准备好的信息。等所有数据源都准备好后再统一发送事务提交(回滚)的通知让各个数据源提交事务。由于最后的提交操作耗时极短所以操作失败的可能性会很低。那么这个两阶段提交协议可能存在什么缺点呢很可能存在被阻塞的问题假如其中一个数据源出现了某些问题阻塞了既不能返回成功信息也不能返回失败信息那么整个事务将被阻塞。对应的策略是添加一些倒计时的操作或者是重新发送消息。3. 分布式事务框架 TX-LCN讲了这么多理论的知识下面讲解一款真正应用在生产中的分布式事务框架 TX-LCN 的运行原理。(典型的分布式事务框架不止 TX-LCN比如还有阿里的 GTS不过 GTS 是收费的TX-LCN 是开源的)我们先看一下官方文档中给出的运行原理示意图思路和我们上面讲的两阶段分布式事务处理流程差不多(有小不同)核心步骤分为 3 步创建事务组在事务发起方开始执行业务代码之前先调用 TxManager 创建事务组对象然后拿到事务表示 GroupId 的过程。简单来说就是对这次下订单的操作在事务管理中心里创建一个对象拿到一个 id。加入事务组参与方在执行完业务方法后将该模块的事务信息通知给 TxManager 的操作。也就是指各个数据源(各个服务)完成操作后和事务管理中心说一声注册一下自己。通知事务组发起方执行业务代码后将发起方执行结果状态通知给 TxManagerTxManager 将根据事务最终状态和事务组的信息来通知相应的参与模块提交或回滚事务并返回结果给事务发起方。和客户打交道的下订单服务会收到减库存和加订单是否成功消息它会把这两个消息通知给事务管理者事务管理者根据情况通知两个库存服务提交事务或回滚事务。目前网上有不错的 TX-LCN 执行源码分析文章:文章中跟着源码走一遍会发现和上面的流程图差不多落实到代码中有一些精彩的地方比如public Object runTransaction(DTXInfo dtxInfo, BusinessCallback business) throws Throwable { if (Objects.isNull(DTXLocalContext.cur())) { DTXLocalContext.getOrNew(); } else { return business.call(); } log.debug(); DTXLocalContext dtxLocalContext DTXLocalContext.getOrNew(); TxContext txContext; // ---------- 保证每个模块在一个DTX下只会有一个TxContext ---------- // if (globalContext.hasTxContext()) { // 有事务上下文的获取父上下文 txContext globalContext.txContext(); dtxLocalContext.setInGroup(true); log.debug(Unit[{}] used parents TxContext[{}]., dtxInfo.getUnitId(), txContext.getGroupId()); } else { // 没有的开启本地事务上下文 txContext globalContext.startTx(); } //......} 这段代码保证了每个模块下只会有一个 TxContext换个说法就是假设一个业务逻辑不是操作不同的数据源而是对同一个数据源执行多次相同的操作那么该数据源对应的模块在 DTX 下会只有一个 TxContextLCN 的事务协调机制LCN 的口号是LCN 并不生产事务LCN 只是本地事务的协调工。大家肯定会有个疑问它不生产事务那么它是怎么控制各个模块在完成事务的逻辑操作之后不马上提交而是等到 TxManager 最后一起通知各模块提交的呢因为每个模块都是一个 TxClient每个 TxClient 下都有一个连接池是框架自定义的连接池对 Connection 使用静态代理的方式进行包装。public class LcnConnectionProxy implements Connection { private Connection connection; public LcnConnectionProxy(Connection connection) { this.connection connection; } /** * notify connection * * param state transactionState * return RpcResponseState RpcResponseState */ public RpcResponseState notify(int state) { try { if (state 1) { log.debug(commit transaction type[lcn] proxy connection:{}., this); connection.commit(); } else { log.debug(rollback transaction type[lcn] proxy connection:{}., this); connection.rollback(); } connection.close(); log.debug(transaction type[lcn] proxy connection:{} closed., this); return RpcResponseState.success; } catch (Exception e) { log.error(e.getLocalizedMessage(), e); return RpcResponseState.fail; } } Override public void setAutoCommit(boolean autoCommit) throws SQLException { connection.setAutoCommit(false); } //......} 连接池在没有接收到通知事务之前会一直占有着这次分布式事务的连接资源。等到最后 TxManager 通知 TxClient 时TxClient 才会去执行相应的提交或回滚。所以 LCN 的事务协调机制相当于是拦截了一下连接池控制了连接的事务提交。imageLCN 的事务补偿机制由于我们不能保证事务每次都正常执行如果在执行某个业务方法时本应该执行成功的操作却因为服务器挂机或网络抖动等问题导致事务没有正常提交这种场景就需要通过补偿来完成事务。在这种情况下 TxManager 会做一个标示;然后返回给发起方。告诉他本次事务有存在没有通知到的情况然后 TxClient 再次执行该次请求事务。最后欢迎大家关注我的公众号【程序员追风】文章都会在里面更新整理的资料也会放在里面。作者程序员追风链接https://www.jianshu.com/p/2973fbd8c8af来源简书著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/86992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站建设域名杭州网站制作多少钱

D - Square Pair 题目大意 给一长为的数组,问有多少对,两者相乘为非负整数完全平方数 解题思路 一个数除以其能整除的最大的完全平方数,看前面有多少个与其余数相同的数,两者乘积满足条件(已经是完全平方数的部分无…

免费做网站刮刮卡佛山专业网站制作设计

1<%2字符串截取函数&#xff0c;用于信息标题 3strWord需要截取的字符串 4intByteLength显示的字节长度&#xff0c;1个汉字两个字节 5intPadDotAmount背截取后尾部补充点的个数 6字符串截取函数&#xff0c;用于信息标题 7Function FixString()Function FixString(ByVal st…

超市型网站开发如何去推广一个app

题目 又到了一年的末尾&#xff0c;项目组让小明负责新年晚会的小礼品发放工作。为使得参加晚会的同时所获得的小礼品价值相对平衡&#xff0c;需要把小礼品根据价格进行分组&#xff0c;但每组最多只能包括两件小礼品&#xff0c;并且每个分组的价格总和不能超过一个价格上限。…

网站建设运营方案 团队免费建站的站点网站

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、注册字符设备驱动的老接口 在《字符设备驱动基础》里&#xff0c;注册字符设备驱动使用的函数是register_chrdev()函数。 该函数的介绍&#xff0c;见博客字符设备驱动基础3——使用register_ch…

discuz怎么做h5网站网站建设哪家服务态度好

1.参数说明&#xff1a;lower_case_table_names0表名存储为给定的大小和比较是区分大小写的lower_case_table_names 1表名存储在磁盘是小写的&#xff0c;但是比较的时候是不区分大小写lower_case_table_names2表名存储为给定的大小写但是比较的时候是小写的unix,linux下lower_…

苏州网站设计公司兴田德润怎么样个人养老保险查询

2019独角兽企业重金招聘Python工程师标准>>> MySql中的varchar类型&#xff08;转&#xff09; 今天新开始的项目在做数据库设计&#xff0c;发现自己对MySql的varchar类型还不熟悉&#xff0c;故又上网收集资料整理如下。 1.varchar类型的变化 MySQL 数据库的va…

网站建设报告家教总结动画设计师工作内容

Hbase&#xff1a;HBase 底层原理详解&#xff08;深度好文&#xff0c;建议收藏&#xff09; - 腾讯云开发者社区-腾讯云 Hbase架构图 同一个列族如果有多个store&#xff0c;那么这些store在不同的region Hbase写流程&#xff08;读比写慢&#xff09; MemStore Flush Hbas…

广州网站优化哪里有网站维护内容有哪些

在过去的几年中&#xff0c;我越来越听到有关“云”服务的信息。 最初&#xff0c;我并不是很想尝试一下。 但是几个月后&#xff08;一年&#xff1f;&#xff09;&#xff0c;我决定看看这是怎么回事。 我从事Java EE开发已经超过7年了&#xff0c;所以我决定看看将Java EE应…

南宁网站制作公司哪家好网站制作的语言

摘要&#xff1a; 本文主要介绍了七种功能强大的聊天机器人开发平台的特点与优点。聊天机器人发布平台是用户访问和使用聊天机器人的媒介&#xff0c;现在流行的一些聊天机器人发布平台有FB Messenger、Kik、Slack、Telegram以及WeChat。而聊天机器人开发平台是可以创建聊天机器…

帝国cms做电影网站如何制作自己想要的图片

课程链接&#xff1a;北京大学陆俊林老师的计算机组成原理课 1. 电子计算机的兴起 原因&#xff1a;二战对计算能力的需求世界上第一台通用电子计算机 ENIAC&#xff08;Electronic Numerical Integrator And Computer&#xff09;&#xff1a;时间&#xff1a;1946&#xff1…

政工网站建设方案北京 网站 建设

原理&#xff1a;遍历下的/proc/%s/task/%s/status所有文件&#xff0c;两个%s都为pid号。 注&#xff1a;多线程下&#xff0c;只打印一个pid/task下的所有目录&#xff0c;即可收集各个线程对应的信息。 $ cat ps.c #include <stdio.h> #include <stdlib.h> #in…

做博客网站什么空间好网站开发原创动漫

JQuery $.ajax() $.ajax({type: POST, //请求方式 一般是get&#xff0c;posturl: url , // 这是必需的&#xff0c;规定把请求发送到哪个 URLdata: data , //这个是可选。映射或字符串值。规定连同请求发送到服务器的数据。java中用request.getPara…

网站开发中背景图片怎么弄全屏网站备案 链接

近日公众号出现了 出现该公众号提供的服务出现故障的错误提示 百度了一下这种错误的可能性 在这里插入图片描述 1. 程序后台未回复微信success 2. 5秒内无响应 3. 授权给了多个第三方平台&#xff0c;其中一个不可用。 4. ToUserName和 FromUserName 参数不正确无法找到接收…

公司网站建设请示163企业邮箱费用

文章目录 鼠标状态改变限制鼠标活动区域 鼠标状态改变 void QApplication::setOverrideCursor (const QCursor & cursor,bool replace FALSE ) // 设置应用程序强制光标为 cursor QApplication::restoreOverrideCursor() // 撤销最近一次的设置每一个setOverrideCursor…

在手机上怎么制作网站个人简历word可编辑

前言&#xff1a; 最近的几场面试都问到了http的相关知识点&#xff0c;博主在此结合书籍和网上资料做下总结。本篇文章讲收录到秋招专题&#xff0c;该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c;对大佬有帮…

寿光网站建设哪家好wordpress启用memcache

Android NDK开发详解之JNI中的库文件 简介工作原理流程原生 activity 和应用 简介 本部分简要介绍了 NDK 的工作原理。Android NDK 是一组使您能将 C 或 C&#xff08;“原生代码”&#xff09;嵌入到 Android 应用中的工具。能够在 Android 应用中使用原生代码对于想执行以下…

门户网站建设解决方案常州网络推广价格

在工业互联网的背景下&#xff0c;电厂三维数字孪生大屏系统正在逐渐成为电力行业的重要技术。通过创建电厂的虚拟模型&#xff0c;这个数字孪生系统可以实现对实际电厂的实时监控&#xff0c;预测维护需求&#xff0c;优化运营效率&#xff0c;甚至在某些情况下&#xff0c;能…

合肥做网站公司广州 网站开发 骏域

Laravel特点&#xff1a;1、“artisan”命令行工具&#xff0c;可以自动化完成手动的工作&#xff1b;2、“migration”管理数据库和版本控制&#xff1b;3、测试功能也很强大&#xff1b;4、适合应用各种开发模式TDD、DDD和BDD&#xff1b;5、支持Composer包管理工具。Laravel…