96SEO 2026-02-19 12:34 13
在同一个进程内#xff0c;控制同一数据源的事务#xff0c;称为本地事务。

例如数据库事务。
事务可以看做是一次大的活动它由不同的小活动组成这些活动要么全部成功要么全部失败。
在同一个进程内控制同一数据源的事务称为本地事务。
例如数据库事务。
在计算机系统中更多的是通过关系型数据库来控制事务这是利用数据库本身的事务特性来实现的因此叫数据库事务由于应用主要靠关系数据库来控制事务而数据库通常和应用在同一个服务器所以基于关系型数据库的事务又被称为本地事务。
AAtomic原子性。
构成事务的所有操作要么都执行完成要么全部不执行不可能出现部分成功部分失
败的情况。
CConsistency一致性。
在事务执行前后数据库的一致性约束没有被破坏。
IIsolation隔离性。
隔离性是指并发的两个事务的执行互不干扰一个事务不能看到其他事务运行过程的中间状态。
通过配置事务隔离级别可以避脏读、重复读等问题。
DDurability持久性。
事务完成之后该事务对数据的更改会被持久化到数据库且不会被回滚。
事务隔离级别脏读不可重复读幻读数据库默认隔离级别读未提交(read
read)否否是mysql串行化(Serializable)否否否/
脏读一个事务更新未提交另一个事务在读取时读到。
不可重复读第一次读取到的记录在第二次读取时未读到。
幻读一个事务在做插入或者删除,另一个事务在做读取时.
分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务。
当单体系统需要访问多个数据库实例时就会产生分布式事务。
简言之跨数据库实例产生分布式事务。
3、多服务访问同一个数据库实例。
原因就是跨JVM进程两个微服务持有了不同的数据库链接进行数据库操作此时产生分布式事务。
与本地事务不同的是分布式系统之所以叫分布式是因为提供服务的各个节点分布在不同机器上相互之间通过网络交互。
不能因为有一点网络问题就导致整个系统无法提供服务网络因素成为了分布式事务的考量标准之一。
因此分布式事务需要更进一步的理论支持。
Consistency、Availability、Partition
tolerance三个词语的缩写分别表示一致性、可用性、分区容忍
一致性是指写操作后的读操作可以读取到最新的数据状态当数据分布在多个节点上从任意结点读取到的数据都是最新的状态。
由于存在数据同步的过程写操作的响应会有一定的延迟。
为了保证数据一致性会对资源暂时锁定待数据同步完成释放锁定资源。
如果请求数据同步失败的结点则会返回错误信息一定不会返回旧数据。
可用性是指任何事务操作都可以得到响应结果且不会出现响应超时或响应错误。
通常分布式系统的各各结点部署在不同的子网这就是网络分区不可避免的会出现由于网络问题而导致结点之间通信失败此时仍可对外提供服务这叫分区容忍性。
在所有分布式事务场景中不会同时具备CAP三个特性因为在具备了P的前提下C和A是不能共存的。
所以在生产中对分布式事务处理时要根据需求来确定满足CAP的哪两个方面。
放弃一致性追求分区容忍性和可用性。
这是很多分布式系统设计时的选择。
实现AP前提是只要用户可以接受所查询的到数据在一定时间内不是最新的即可。
通常实现AP都会保证最终一致性后面讲的BASE理论就是根据AP来扩展的一些业务场景比如订单退款今日退款成功明日账户到账只要用户可以接受在一定时间内到账即可。
放弃可用性追求一致性和分区容错性我们的zookeeper其实就是追求的强一致又比如跨行转账一次转账请求要等待双方银行系统都完成整个事务才算完成。
放弃分区容忍性即不进行分区不考虑由于网络不通或结点挂掉的问题则可以实现一致性和可用性。
那么系统将不是一个标准的分布式系统我们最常用的关系型数据就满足了CA。
CAP理论告诉我们一个分布式系统最多只能同时满足一致性Consistency、可用性Availability和分区容忍性Partition
tolerance这三项中的两项其中AP在实际应用中较多AP即舍弃一致性保证可用性和分区容忍性但是在实际生产中很多场景都要实现一致性比如前边我们举的例子主数据库向从数据库同步数据即使不要一致性但是最终也要将数据同步成功来保证数据一致这种一致性和CAP中的一致性不同CAP中的一致性要求在任何时间查询每个结点数据都必须一致它强调的是强一致性但是最终一致性是允许可以在一段时间内每个结点的数据不一致但是经过一段时间每个结点的数据必须一致它强调的是最终数据的一致性。
(最终一致性)三个短语的缩写。
BASE理论是对CAP中AP的一个扩展通过牺牲强一致性来获得可用性当出现故障允许部分不可用但要保证核心功能可用允许数据在一段时间内是不一致的但最终达到一致状态。
满足BASE理论的事务我们称之为“柔性事务”。
基本可用:分布式系统在出现故障时允许损失部分可用功能保证核心功能可用。
软状态:由于不要求强一致性所以BASE允许系统中存在中间状态也叫软状态这个状态不影响系统可用性如订单的支付中、“数据同步中”等状态待数据最终一致后状态改为“成功”状态。
最终一致:最终一致是指经过一段时间后所有节点数据都将会达到一致。
如订单的支付中状态最终会变为“支付成功”或者支付失败使订单状态与实际交易结果达成一致但需要一定时间的延迟、等待。
针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知这几种。
2PC的传统方案是在数据库层面实现的如Oracle、MySQL都支持2PC协议为了统一标准减少行业内不必要的对接成本需要制定标准化的处理模型及接口标准国际开放标准组织Open
Group定义了分布式事务处理模型DTPDistributed
Program)即应用程序可以理解为使用DTP分布式事务的程序。
RM(Resource
Manager)即资源管理器可以理解为事务的参与者一般情况下是指一个数据库实例通过资源管理器对该数据库进行控制资源管理器控制着分支事务。
TM(Transaction
Manager)事务管理器负责协调和管理事务事务管理器控制着全局事务管理事务生命周期并协调各个RM。
全局事务是指分布式事务处理环境中需要操作多个数据库共同完成一个工作这个工作即是一个全局事务。
DTP模型定义TM和RM之间通讯的接口规范叫XA简单理解为数据库提供的2PC接口协议基于数据库的XA协议来实现2PC又称为XA方案。
2TM交易中间件通过**XA接口**来通知RM数据库事务的开始、结束以及提交、回滚等。
整个2PC的事务流程涉及到三个角色AP、RM、TM。
AP指的是使用2PC分布式事务的应用程序RM指的是资源管理器它控制着分支事务TM指的是事务管理器它控制着整个全局事务。
2在提交阶段TM会接受RM在准备阶段的执行回复只要有任一个RM执行失败TM会通知所有RM执行回滚操作否则TM将会通知所有RM提交该事务。
提交阶段结束资源锁释放。
Fescar后更名为Seata它是一个是开源的分布式事务框架。
传统2PC的问题在Seata中得到了解决它通过对本地关系数据库的分支事务的协调来驱动完成全局事务是工作在应用层的中间件。
主要优点是性能较好且不长时间占用连接资源它以高效并且对业务零侵入的方式解决微服务场景下面临的分布式事务问题它目前提供AT模式(即2PC)及TCC模式的分布式事务解决方案。
Seata的设计目标其一是对业务无侵入因此从业务无侵入的2PC方案着手在传统2PC的基础上演进并解决2PC方案面临的问题。
Seata把一个分布式事务理解成一个包含了若干分支事务的全局事务。
全局事务的职责是协调其下管辖的分支事务达成一致要么一起成功提交要么一起失败回滚。
此外通常分支事务本身就是一个关系数据库的本地事务下图是全局事务与分支事务的关系图
事务协调器它是独立的中间件需要独立部署运行它维护全局事务的运行状态接收TM指令发起全局事务的提交与回滚负责与RM通信协调各各分支事务的提交或回滚。
Transaction
事务管理器TM需要嵌入应用程序中工作它负责开启一个全局事务并最终向TC发起全局提交或全局回滚的指令。
Resource
控制分支事务负责分支注册、状态汇报并接收事务协调器TC的指令驱动分支本地事务的提交和回滚。
两阶段提交方面传统2PC无论第二阶段的决议是commit还是rollback事务性资源的锁都要保持到Phase2完成才释放。
而Seata的做法是在Phase1
就将本地事务提交这样就可以省去Phase2持锁的时间整体提高效率。
TCC是Try、Confirm、Cancel三个词语的缩写TCC要求每个分支事务实现三个操作预处理Try、确认Confirm、撤销Cancel。
Try操作做业务检查及资源预留Confirm做业务确认操作Cancel实现一个与Try相反的操作即回滚操作。
TM首先发起所有的分支事务的try操作任何一个分支事务的try操作执行失败TM将会发起所有分支事务的Cancel操作若try操作全部成功TM将会发起所有分支事务的Confirm操作其中Confirm/Cancel操作若执行失败TM会进行重试。
阶段是做业务检查(一致性)及资源预留(隔离)此阶段仅是一个初步操作它和后续的Confirm
Confirm阶段是不会出错的。
即只要Try成功Confirm一定成功。
若Confirm阶段真的出错了需引入重试机制或人工处理。
阶段是在业务执行错误需要回滚的状态下执行分支事务的业务取消预留资源释放。
通常情况下采用TCC则认为Cancel阶段也是一定成功的。
若Cancel阶段真的出错了需引入重试机制或人工处理。
TM事务管理器可以实现为独立的服务也可以让全局事务发起方充当TM的角色TM独立出来是为了成为公
TM在发起全局事务时生成全局事务记录全局事务ID贯穿整个分布式事务调用链条用来记录事务上下文
和cancel失败需进行重试因此需要实现为幂等幂等性是指同一个操作无论请求
tcc-transaction:https://github.com/changmingxie/tcc-transactionHmily:https://github.com/yu199195/hmilyByteTCC:https://github.com/liuyangming/ByteTCCEasyTransaction:https://github.com/QNJR-GROUP/EasyTransaction
出现原因是当一个分支事务所在服务宕机或网络异常分支事务调用记录为失败这个时候其实是没有执行Try阶段当故障恢复后分布式事务进行回滚则会调用二阶段的Cancel方法从而形成空回滚。
解决思路是关键就是要识别出这个空回滚。
思路很简单就是需要知道一阶段是否执行如果执行了那就是正常回滚如果没执行那就是空回滚。
前面已经说过TM在发起全局事务时生成全局事务记录全局事务ID贯穿整个分布式事务调用链条。
再额外增加一张分支事务记录表其中有全局事务
接口里读取该记录如果该记录存在则正常回滚如果该记录不存在则是空回滚。
通过前面介绍已经了解到为了保证TCC二阶段提交重试机制不会引发数据不一致要求
接口保证幂等这样不会重复使用或者释放资源。
如果幂等控制没有做好很有可能导致数据不一致等严重问题。
解决思路在上述“分支事务记录”中增加执行状态每次执行前都查询该状态。
方法预留的业务资源只有该分布式事务才能使用该分布式事务第一阶段预留的业务资源就再也没有人能够处理了对于这种情况我们就称为悬挂即业务资源预留后没法继续处理。
解决思路是如果二阶段执行完成那一阶段就不能再继续执行。
在执行一阶段事务时判断在该全局事务下“分支事务记录”表中是否已经有二阶段事务记录如果有则不执行Try。
可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息事务参与方(消息消费者)一定能
够接收消息并处理事务成功此方案强调的是只要消息发给事务参与方最终事务要达到一致。
事务发起方消息生产方将消息发给消息中间件事务参与方从消息中间件接收消息事务发起方和消息中间件之间事务参与方消息消费方和消息中间件之间都是通过网络通信由于网络通信的不确定性会导致分布式事务问题。
本地事务与消息发送的原子性问题即事务发起方在本地事务执行成功后消息必须发出去否则就丢弃消息。
即实现本地事务和消息发送的原子性要么都成功要么都失败。
本地事务与消息发送的原子性问题是实现可靠消息最终一致性方案的关键问题。
事务参与方必须能够从消息队列接收到消息如果接收消息失败可以重复接收消息。
由于网络2的存在若某一个消费节点超时但是消费成功此时消息中间件会重复投递此消息就导致了消息的重复消费。
本地消息表这个方案最初是eBay提出的此方案的核心是通过本地事务保证数据业务操作和消息的一致性然后通过定时任务将消息发送至消息中间件待确认消息发送给消费方成功再将消息删除。
RocketMQ本身提供的存储机制为事务消息提供了持久化能力RocketMQ
的高可用机制以及可靠消息设计则为事务消息在系统发生异常时依然能够保证达成事务的最终一致性。
4.3后实现了完整的事务消息实际上其实是对本地消息表的一个封装将本地消息表移动到了MQ内部解决
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yrUpvcvB-1676785616521)(https://demon75520-images.oss-cn-shanghai.aliyuncs.com/csdn/2022/06/分布式事务专题-v1.jpg)]
即MQ发送方本例中是用户服务负责新增用户。
MQ订阅方即消息消费方本例中是积分服务负责新增积分。
Server将消息状态标记为Prepared预备状态注意此时这条消息消费者MQ订阅方是无法消费到的。
本例中Producer
端执行业务代码逻辑通过本地数据库事务控制。
本例中Producer
本地事务执行成功则自动向MQServer发送commit消息MQ
本地事务执行失败则自动向MQServer发送rollback消息MQ
MQ订阅方积分服务消费消息消费成功则向MQ回应ack否则将重复接收消息。
这里ack默认自动回应即程序执行正常则自动回应ack。
如果执行Producer端本地事务过程中执行端挂掉或者超时MQ
以上主干流程已由RocketMQ实现对用户侧来说用户需要分别实现本地事务执行以及本地事务回查方法因此只需关注本地事务的执行状态即可。
RoacketMQ提供RocketMQLocalTransactionListener接口
RocketMQLocalTransactionListener
发送prepare消息成功此方法被回调该方法用于执行本地事务‐
回传的消息利用transactionId即可获取到该消息的唯一Id‐
调用send方法时传递的参数当send时候若有额外的参数可以传递到send方法中这里能获取到‐
UNKNOW回调*/RocketMQLocalTransactionState
executeLocalTransaction(Message
通过获取transactionId来判断这条消息的本地事务执行状态‐
UNKNOW回调*/RocketMQLocalTransactionState
最大努力通知方案的目标发起通知方通过一定的机制最大努力将业务处理结果通知到接收方。
因为接收通知方可能没有接收到通知此时要有一定的机制对消息重复通知。
如果尽最大努力也没有通知到接收方或者接收方消费消息后要再次消费此时可由接收方主动向通知方查询消息信息来满足需求。
可靠消息一致性发起通知方需要保证将消息发出去并且将消息发到接收通知方消息的可靠性关键由发起通知方来保证。
最大努力通知发起通知方尽最大的努力将业务处理结果通知为接收通知方但是可能消息接收不到此时需要接收通知方
主动调用发起通知方的接口查询业务处理结果通知的可靠性关键在接收通知方。
可靠消息一致性关注的是交易过程的事务一致以异步的方式完成交易。
最大努力通知关注的是交易后的通知事务即将交易结果可靠的通知出去。
可靠消息一致性要解决消息从发出到接收的一致性即消息发出并且被接收到。
最大努力通知无法保证消息从发出到接收的一致性只提供消息接收的可靠性机制。
可靠机制是最大努力的将消息通知给接收方当消息无法被接收方接收时由接收方主动查询消息业务处理结果。
通过对最大努力通知的理解采用MQ的ack机制就可以实现最大努力通知。
本方案是利用MQ的ack机制由MQ向接收通知方发送通知流程如下
MQ会按照间隔1min、5min、10min、30min、1h、2h、5h、10h的方式逐步拉大通知间隔
rocketMq在broker中可进行配置直到达到通知要求的时间窗口上限。
本方案也是利用MQ的ack机制与方案1不同的是应用程序向接收通知方发送通知
使用可靠消息一致方案中的事务消息保证本地事务与消息的原子性最终将通知先发给MQ。
3、通知程序通过互联网接口协议如http、webservice调用接收通知方接口完成通知。
通知程序调用接收通知方案接口成功就表示通知成功即消费MQ消息成功MQ将不再向通知程序投递通知消息。
2、方案2中由通知程序与MQ接口通知程序监听MQ收到MQ的消息后由通知程序通过互联网接口协议调用接收通知方。
此方案主要应用于外部应用之间的通知例如支付宝、微信的支付结果通知。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback