如何用消息系统避免分布式事务

作者&投稿:廉到 (若有异议请与网页底部的电邮联系)
如何用消息系统避免分布式事务~

这两年来,随着NoSQL系统、CAP理论和Eventual Consistency的大热,关于分布式操作要保证强一致还是弱一致性的讨论络驿不绝。双方各执一词,倾向实现强一致性的一方认为弱一致性满足不了应用开发的需要,倾向实现弱一致性的一方则认为保证强一致性将导致系统性能与可伸缩性难以接受。弱一致性能否满足应用开发的需求这一点由应用特征决定,难以一概而论,但强一致性对系统性能、可伸缩性和可用性的影响则是可以作技术分析的。奇怪的是,找了很久,也没找到对这一问题的深入分析,决定自己来做一个。对于分布式操作,一般来说有以下两种实现选择:1、 在每个节点上使用单独的事务,只实现弱一致性。2、 使用2PC保证强一致性。即分布式事务协调者先要求所有参与节点PREPARE,大家都说PREPARE成功后,再要求所有节点COMMIT。只要有一个节点PREPARE不成功,大家都要回滚。这样参与者要强制写两次日志,协调者在决定要COMMIT时也要强制写一次日志。首先,假设用户发起分布式操作的速率为TpS(Transactions per Second),每个分布式操作平均会操作K个节点。在每个节点上,平均要操作RpT(Rows per Transaction)条记录,而操作每条记录平均要用时TpR(Time per Row),这样在每个节点上事务操作的执行时间为: TExec=RpT×TpR另外,设定以下参数:- N:数据库中所有节点上的总记录数- TCommit:在每个节点上PREPARE或COMMIT的时间,PREPARE和COMMIT的主要工作都是写相应的日志,执行时间接近对分布式操作性能方面一种常见的认识是若使用2PC,将导致事务执行时间大为延长,从而导致过高的事务并发冲突和死锁。当然,从趋势上使用2PC自然会导致并发冲突和死锁增长,但是否能满足应用需求,需要定量的来分析。由于死锁的概率完全取决于冲突概率,以下只分析冲突概率。对选择1,即每个节点用独立事务时,用户发起的每个事务都会被分成K个小事务,这时系统中的并发事务数是事务速率与事务持续时间之积,即: CT_1=TpS×K×(RpT×TpR+TCommit)当某事务要锁定并操作某条记录时,系统中被其它事务所锁定的记录数是(CT_1-1)×RpT≈CT_1×RpT。假设事务操作的记录是纯随机的,则该事务要锁定的记录与其它事务冲突的概率是(CT_1×RpT)/N。而这个事务总共要锁定RpT条记录,则该事务与其它事务冲突的概率是: TWait_1=1-(1-(CT_1×RpT)/N )^RpT≈CT_1×RpT^2/N对选择2,即使用2PC保证强一致性时,每个节点上需要强制写两次日志,在事务协调者上还要强制写一次PREPARE日志(事务协调者上的COMMIT日志不需要强制写,这一时间可以忽略)。系统中的并发事务数是: CT_2=TpS×((RpT×TpR+2×TCommit)×K+TCommit)但此时系统中被其它事务所锁定的记录数是选择1的K倍,且事务要锁定的记录数也是选择1的K倍,这时事务的冲突概率是: TWait_2≈CT_2×RpT^2×K^2/N这个公式比较复杂,我们先简化一下,假设TCommit和TPrepare时间相对于TExec来说可以忽略,则可以得到有: TWait_2=TWait_1×K^2也就是说事务冲突的概率将会随着分布式操作涉及的节点数K的平方数增长。平方数增长听起来比较厉害,但实际上在真实应用中K通常是很小的,绝大多数情况下等于2。如经典的转账问题,就只涉及两个节点,还有比如建立好友关系时也只涉及两个节点。在使用我们分布式数据库的大量应用中(总共包含约500张表,上千个索引,几千种SQL模式),绝大多数情况下K为2,很少有3,超过3的更是绝无仅有。因此,如果我们忽略2PC PREPARE和提交的时间,则使用2PC时会导致事务冲突概率4~9倍的增长。换一种情况,如果执行很快但提交写日志很慢,即TExec相对于TCommit来说可以忽略,则可以得到: TWait_2=TWait_1×(2×K+1)/K×K^2这时的情况比只考虑执行时间时差一些,但还是随着分布式操作涉及的节点数K的平方数增长,只不过从4~9倍变成10~21倍。真实的情况一般在这两者之间,作为估算,可以大致认为采用2PC保证强一致性时将导致事务冲突概率增加8倍左右。性能方面还涉及到吞吐率和响应时间。类似的进行分析,可以发现如果TCommit相对于TExec可以忽略,则响应时间不受2PC影响,反之,则2PC会导致响应时间增加为原来的3倍,平均的估计可以取增加1倍。对大多数应用,日志提交的吞吐率完全足够,则事务吞吐率不受2PC影响,反之,事务吞吐率会下降一半。对大多数WEB应用冲突概率非常低,分布式操作只涉及2~3个节点,日志提交的吞吐率完全足够,则使用2PC可能带来的影响是事务冲突与死锁增加8倍左右,响应时间延长1倍,吞吐率不受影响。这些性能影响应该说是完全可以接受的,此时2PC带来的强一致性优点可以说远远超过其对性能的影响。当然,以上分析中忽略了很多因素,比如网络延时,比如客户端在发起事务的多个操作之间还可能休息一会。加入这些因素后的性能分析会更复杂,但这些因素,本质上是使事务的持续时间增加,跟是否使用2PC无关。使用2PC与不使用2PC之间的性能差异比例,与这些因素关系不大。但有一个问题需要注意。如果让客户端直接充当分布式事务的协调者,由于客户端上通常不像数据库服务器那样配置带电池的写缓存,fsync的性能很差,2PC将导致简单分布式事务的响应时间增加一个数量级,冲突概率更是可能增加两个数量级,事务提交的吞吐率也可能受到影响。解决方法是部署专职的高性能分布式事务协调者集群,配置高性能的日志存储设备如SSD。基于这一基本的性能分析,还有一些变种:1、如果分布式操作在各节点上并行执行,可以计算出冲突概率将是不并行的1/K。这仍比不用2PC串行高K倍,但不再是K的平方倍。比如BigTable中对二级索引和主记录的修改,就可以并行。2、如果分布式操作是否冲突只取决于其中一个节点,可以计算出2PC并不会导致冲突概率显著增加。符合这一特征的应用模式还是BigTable中对主记录及其所有二级索引的修改,冲不冲突,完全取决于是否更新同一条记录,跟索引无关。根据这两点也可以看出,如果用并行的2PC来保证主记录及其二级索引之间的一致性,其所带来的性能影响弱于2PC对一般分布式事务的影响,是完全可以实用的方案。对使用2PC分布式事务的另外一个比较大的担心是如果2PC在PREPARE之后事务协调者崩溃,则参与分布式事务的各个节点只能长时间的锁定资源,等待协调者复活后告诉它事务应该提交还是回滚。如果直接让客户端直接充当分布式事务的协调者,这一问题可能很严重,因为客户端多而杂,崩溃概率高。但如果部署了专职的高性能分布式事务协调者集群,则这一问题基本可以避免。

分布式系统架构中,分布式事务问题是一个绕不过去的挑战。而微服务架构的流行,让分布式事问题日益突出!
下面我们以电商购物支付流程中,在各大参与者系统中可能会遇到分布式事务问题的场景进行详细的分析!


如上图所示,假设三大参与平台(电商平台、支付平台、银行)的系统都做了分布式系统架构拆分,按上数中的流程步骤进行分析:
1、电商平台中创建订单:预留库存、预扣减积分、锁定优惠券,此时电商平台内各服务间会有分布式事务问题,因为此时已经要跨多个内部服务修改数据;
2、支付平台中创建支付订单(选银行卡支付):查询账户、查询限制规则,符合条件的就创建支付订单并跳转银行,此时不会有分布式事务问题,因为还不会跨服务改数据;
3、银行平台中创建交易订单:查找账户、创建交易记录、判断账户余额并扣款、增加积分、通知支付平台,此时也会有分布式事务问题(如果是服务化架构的话);
4、支付平台收到银行扣款结果:更改订单状态、给账户加款、给积分帐户增加积分、生成会计分录、通知电商平台等,此时也会有分布式事务问题;
5、电商平台收到支付平台的支付结果:更改订单状态、扣减库存、扣减积分、使用优惠券、增加消费积分等,系统内部各服务间调用也会遇到分布式事问题;


如上图,支付平台收到银行扣款结果后的内部处理流程:
1、支付平台的支付网关对银行通知结果进行校验,然后调用支付订单服务执行支付订单处理;
2、支付订单服务根据银行扣款结果更改支付订单状态;
3、调用资金账户服务给电商平台的商户账户加款(实际过程中可能还会有各种的成本计费;如果是余额支付,还可能是同时从用户账户扣款,给商户账户加款);
4、调用积分服务给用户积分账户增加积分;
5、调用会计服务向会计(财务)系统写进交易原始凭证生成会计分录;
6、调用通知服务将支付处理结果通知电商平台;


如上图,把支付系统中的银行扣款成功回调处理流程提取出来,对应的分布式事务问题的代码场景:
/** 支付订单处理 **/
@Transactional(rollbackFor = Exception.class)
public void completeOrder() {
orderDao.update(); // 订单服务本地更新订单状态
accountService.update(); // 调用资金账户服务给资金帐户加款
pointService.update(); // 调用积分服务给积分帐户增加积分
accountingService.insert(); // 调用会计服务向会计系统写入会计原始凭证
merchantNotifyService.notify(); // 调用商户通知服务向商户发送支付结果通知
}

本地事务控制还可行吗?

以上分布式事务问题,需要多种分布式事务解决方案来进行处理。

订单处理:本地事务

资金账户加款、积分账户增加积分:TCC型事务(或两阶段提交型事务),实时性要求比较高,数据必须可靠。


会计记账:异步确保型事务(基于可靠消息的最终一致性,可以异步,但数据绝对不能丢,而且一定要记账成功)


商户通知:最大努力通知型事务(按规律进行通知,不保证数据一定能通知成功,但会提供可查询操作接口进行核对)


本质上问题可以抽象为:当一个表数据更新后,怎么保证另一个表的数据也必须要更新成功。

1 本地事务

还是以支付宝转账余额宝为例,假设有

支付宝账户表:A(id,userId,amount)
余额宝账户表:B(id,userId,amount)
用户的userId=1;

从支付宝转账1万块钱到余额宝的动作分为两步:

1)支付宝表扣除1万:update A set amount=amount-10000 where userId=1;
2)余额宝表增加1万:update B set amount=amount+10000 where userId=1;

如何确保支付宝余额宝收支平衡呢?

有人说这个很简单嘛,可以用事务解决。

Begin
transaction

update
A set

amount=amount-10000

where userId=1;

update
B set

amount=amount+10000

where userId=1;

End
transaction

commit;

非常正确,如果你使用spring的话一个注解就能搞定上述事务功能。

@Transactional(rollbackFor=Exception.class)

public

void
update() {

updateATable();
//更新A表

updateBTable();
//更新B表

}

如果系统规模较小,数据表都在一个数据库实例上,上述本地事务方式可以很好地运行,但是如果系统规模较大,比如支付宝账户表和余额宝账户表显然不会在同一个数据库实例上,他们往往分布在不同的物理节点上,这时本地事务已经失去用武之地。

既然本地事务失效,分布式事务自然就登上舞台。

2 分布式事务—两阶段提交协议

两阶段提交协议(Two-phase Commit,2PC)经常被用来实现分布式事务。一般分为协调器C和若干事务执行者Si两种角色,这里的事务执行者就是具体的数据库,协调器可以和事务执行器在一台机器上。

1) 我们的应用程序(client)发起一个开始请求到TC;

2)
TC先将<prepare>消息写到本地日志,之后向所有的Si发起<prepare>消息。以支付宝转账到余额宝为例,TC给
A的prepare消息是通知支付宝数据库相应账目扣款1万,TC给B的prepare消息是通知余额宝数据库相应账目增加1w。为什么在执行任务前需要
先写本地日志,主要是为了故障后恢复用,本地日志起到现实生活中凭证 的效果,如果没有本地日志(凭证),出问题容易死无对证;

3) Si收到<prepare>消息后,执行具体本机事务,但不会进行commit,如果成功返回<yes>,不成功返回<no>。同理,返回前都应把要返回的消息写到日志里,当作凭证。

4)
TC收集所有执行器返回的消息,如果所有执行器都返回yes,那么给所有执行器发生送commit消息,执行器收到commit后执行本地事务的
commit操作;如果有任一个执行器返回no,那么给所有执行器发送abort消息,执行器收到abort消息后执行事务abort操作。

注:TC或Si把发送或接收到的消息先写到日志里,主要是为了故障后恢复用。如某一Si从故障中恢复后,先检查本机的日志,如果已收
到<commit >,则提交,如果<abort
>则回滚。如果是<yes>,则再向TC询问一下,确定下一步。如果什么都没有,则很可能在<prepare>阶段Si就
崩溃了,因此需要回滚。

现如今实现基于两阶段提交的分布式事务也没那么困难了,如果使用java,那么可以使用开源软件atomikos(http://www.atomikos.com/)来快速实现。

不过但凡使用过的上述两阶段提交的同学都可以发现性能实在是太差,根本不适合高并发的系统。为什么?

1)两阶段提交涉及多次节点间的网络通信,通信时间太长!
2)事务时间相对于变长了,锁定的资源的时间也变长了,造成资源等待时间也增加好多!

正是由于分布式事务存在很严重的性能问题,大部分高并发服务都在避免使用,往往通过其他途径来解决数据一致性问题。

3 使用消息队列来避免分布式事务

如果仔细观察生活的话,生活的很多场景已经给了我们提示。

比如在北京很有名的姚记炒肝点了炒肝并付了钱后,他们并不会直接把你点的炒肝给你,而是给你一张小票,然后让你拿着小票到出货区排队去取。为什么他们要将付钱和取货两个动作分开呢?原因很多,其中一个很重要的原因是为了使他们接待能力增强(并发量更高)。

还是回到我们的问题,只要这张小票在,你最终是能拿到炒肝的。同理转账服务也是如此,当支付宝账户扣除1万后,我们只要生成一个凭证(消息)即可,这个凭
证(消息)上写着“让余额宝账户增加
1万”,只要这个凭证(消息)能可靠保存,我们最终是可以拿着这个凭证(消息)让余额宝账户增加1万的,即我们能依靠这个凭证(消息)完成最终一致性。

3.1 如何可靠保存凭证(消息)

有两种方法:

3.1.1 业务与消息耦合的方式

支付宝在完成扣款的同时,同时记录消息数据,这个消息数据与业务数据保存在同一数据库实例里(消息记录表表名为message)。

Begin
transaction

update
A set

amount=amount-10000

where userId=1;

insert
into message(userId, amount,status) values(1,
10000,
1);

End
transaction

commit;

上述事务能保证只要支付宝账户里被扣了钱,消息一定能保存下来。

当上述事务提交成功后,我们通过实时消息服务将此消息通知余额宝,余额宝处理成功后发送回复成功消息,支付宝收到回复后删除该条消息数据。

3.1.2 业务与消息解耦方式

上述保存消息的方式使得消息数据和业务数据紧耦合在一起,从架构上看不够优雅,而且容易诱发其他问题。为了解耦,可以采用以下方式。

1)支付宝在扣款事务提交之前,向实时消息服务请求发送消息,实时消息服务只记录消息数据,而不真正发送,只有消息发送成功后才会提交事务;

2)当支付宝扣款事务被提交成功后,向实时消息服务确认发送。只有在得到确认发送指令后,实时消息服务才真正发送该消息;

3)当支付宝扣款事务提交失败回滚后,向实时消息服务取消发送。在得到取消发送指令后,该消息将不会被发送;

4)对于那些未确认的消息或者取消的消息,需要有一个消息状态确认系统定时去支付宝系统查询这个消息的状态并进行更新。为什么需要这一步骤,举个例子:假设在第2步支付宝扣款事务被成功提交后,系统挂了,此时消息状态并未被更新为“确认发送”,从而导致消息不能被发送。

优点:消息数据独立存储,降低业务系统与消息系统间的耦合;

缺点:一次消息发送需要两次请求;业务处理服务需要实现消息状态回查接口。

3.2 如何解决消息重复投递的问题

还有一个很严重的问题就是消息重复投递,以我们支付宝转账到余额宝为例,如果相同的消息被重复投递两次,那么我们余额宝账户将会增加2万而不是1万了。

为什么相同的消息会被重复投递?比如余额宝处理完消息msg后,发送了处理成功的消息给支付宝,正常情况下支付宝应该要删除消息msg,但如果支付宝这时候悲剧的挂了,重启后一看消息msg还在,就会继续发送消息msg。

解决方法很简单,在余额宝这边增加消息应用状态表(message_apply),通俗来说就是个账本,用于记录消息的消费情况,每次来一个消息,在真正
执行之前,先去消息应用状态表中查询一遍,如果找到说明是重复消息,丢弃即可,如果没找到才执行,同时插入到消息应用状态表(同一事务)。

for

each
msg in

queue

Begin
transaction

select
count(*) as

cnt from message_apply where msg_id=msg.msg_id;

if

cnt==0

then

update
B set

amount=amount+10000

where userId=1;

insert
into message_apply(msg_id) values(msg.msg_id);

End
transaction

commit;


在及时语平台的使用过程中邮件\/消息为什么不能自动分配了?
第一,客服是否处于登录状态,员工扫码登录后,需要将坐席状态切换为在线,如图,系统默认在在线状态下,方可进行自动分配。第二,管理员权限中,邮件\/会话是否还存有待处理,如果没有待处理,说明系统已经将所有邮件\/消息分配完毕∞等待新的邮件和消息会自动分配。第三,承接量是否满额,系统默认承接量为3...

为什么需要消息队列?使用消息队列有哪些好处?
通过引入MQ,将同步接口调用转变为异步操作,显著缩短了系统响应时间,优化了用户体验。同时,系统间的依赖关系从复杂的多对多转变为简单的点对点,大大降低了耦合度,提高了系统的稳定性。对于突发请求峰值,MQ能够通过调节消费者处理速度,平滑处理大量请求,避免了系统压力过大导致的不稳定。然而,引入消息...

如何禁止小米手机分身消息在初始空间推送?
首先进入分身副系统 然后在分身副系统里面打开设置-特色功能-手机分身-来自手机分身的通知(点关闭)另外送一条更有用的,在关闭分身通知的同时,把系统设置分身入口也关了(这样主系统连手机分身的菜单都找不到,完美隐藏,想删都找不到入口,不过换手机了,一定记得在分身系统里面打开,然后再到主系统...

为什么微信发信息频繁被限制
1. 原因概述:当用户在微信上进行某些操作时,如果频率超过了系统的正常识别范围,系统就会做出限制,以防止资源过度占用或避免潜在的风险。这种情况常发生在大量发送消息、频繁添加好友、使用自动化工具进行操作等场景下。2. 具体情境分析:大量发送消息:如果用户在短时间内向大量好友发送消息,系统可能会暂...

如何使用信息系统提高企业管理水平
有用的信息必须是正确的信息;错误的信息只能导致错误的决策。2.3企业信息化建设价值优势1)、实现信息的有效管理:信息的有效流通与共享。消除企业内部信息不畅的问题,提高员工的学习与创新能力,提高员工之间的合作意识,增强企业的凝聚力。2)、提高工作效率:通过公文流转的自动化,避免了传统公文流转时由于手工递送而带来...

玩QQ游戏时发出的消息为什么显示发送信息失败,系统无法识别您发送的部...
1.因为骂人等原因,被巡查禁言了,可以到 http:\/\/qqgame.qq.com\/list\/查询是否被禁言(如果查过了就不用去咯)2.可能说的东西里有有被屏蔽的关键字,所以导致不能发言哦~~3.检查一下你电脑的输入法,看看是不输入法出了问题 4.游戏还没玩够一定的局数导致的不可以发言。5.可能是因为你游戏中...

分布式事务怎么来实现?xa?cap?base
配置文件最重要的部分就是ActiveMQ的持久化策略,连接消息系统和相同数据源作为业务数据,Spring JmsTemplate的flag标签用来接收消息。清单4 展示了如何配置ActiveMQ持久化策略:清单4、ActiveMQ持久化配置<bean id="connectionFactory" depends-on="brokerService"> <property name="brokerURL" value="vm:\/\/localhost?asyn...

java 初级、中级、高级工程师有什么区别?
4、熟悉Oracle、MySQL等数据库开发与设计以及缓存系统Redis或 Memcached的设计和研发;关系数据库:oracle;PostgreSQL 缓存系统:Redis(Nosql)缓存系统:Memcached。 5、熟悉底层中间件、分布式技术(包括缓存、消息系统、热部署、JMX等)、底层中间件:应用服务器:Jetty(Tomcat)、 消息中间件:ActiveMQ、RabbitMQ、事务处理中间...

聊聊 消息中心的设计与实现
6. **消息并发控制**:通过设置消息队列大小限制和拒绝策略避免消息堆积过多,RocketMQ支持设置各个主题的队列数和消息大小限制。7. **消息可靠性**:实现消息持久化、消息回溯、消息补发机制,利用数据库和消息队列的历史轨迹保证消息不丢失,RocketMQ支持持久化和延迟队列、死信队列功能。8. **系统监控...

为什么微信发消息频繁
操作过于频繁:如果在短时间内连续发送大量的消息,或者频繁地切换不同的聊天窗口,可能会被系统视为异常操作,从而触发限制。三、解决办法 当出现微信发消息过于频繁的情况时,可以尝试以下方法解决:1. 检查网络连接:确保网络连接稳定,避免因网络问题导致的误判。2. 等待一段时间再操作:被系统限制后,...

武城县15678399794: 如何用消息系统避免分布式事务 -
时卞卡前: 这两年来,随着NoSQL系统、CAP理论和Eventual Consistency的大热,关于分布式操作要保证强一致还是弱一致性的讨论络驿不绝.双方各执一词,倾向实现强一致性的一方认为弱一致性满足不了应用开发的需要,倾向实现弱一致性的一方则...

武城县15678399794: 如何避免误用分布式事务 -
时卞卡前: 分布式事务本质上是引入了第三方裁判,来想办法对多个本地事务监控同时成功或同时失败,这里分享几个知识点: A:如果代码块里,若存在两个或以上数据库链接DbConnection,则需要启动微软的MSDTC分布式事务服务. 用命令行启动或...

武城县15678399794: 什么是系统架构设计师事务原则?
时卞卡前: 事务原则 事务可以提供重要的支持,以确保不会违反业务规则并维护数据一致性.事务可以确保一组相关任务作为一个单元成功或失败.您可以使用事务来维护本地数据库...

武城县15678399794: 请教Dubbo 如何解决分布式事务 -
时卞卡前: 目前比较多的解决方案有几个:一、结合MQ消息中间件实现的可靠消息最终一致性 二、TCC补偿性事务解决方案 三、最大努力通知型方案 第一种方案:可靠消息最终一致性,需要业务系统结合MQ消息中间件实现,在实现过程中需要保证消息...

武城县15678399794: 如何解决分布式系统数据事务一致性问题 -
时卞卡前: 用户在京东上下了一个订单,发现自己在京东的账户里面有余额,然后使用余额支付,支付成功之后,订单状态修改为支付成功,然后通知仓库发货.假设订单系统,支付系统,仓库系统是三个独立的应用,是独立部署的,系统之间通过远程服...

武城县15678399794: 如何正确理解CAP理论 -
时卞卡前: 常见的理解及分析 目前流行的、对CAP理论解释的情形是从同一数据在网络环境中的多个副本出发的.为了保证数据不会丢失,在企业级的数据管理方案中,一般必须考虑数据的冗余存储问题,而这应该是通过在网络上的其他独立物理存储节...

武城县15678399794: 为什么说分布式事务不再适用于微服务架构 -
时卞卡前: 楼主这个说法很标准,不是不可用,只是不适用.我们看下为什么分布式事务不再适用于微服务架构.多个微服务应用就构成了分布式系统,由此会带来固有的复杂性.开发者需要在RPC或者消息传递之间选择并完成进程间通讯机制.更甚于...

武城县15678399794: Java分布式系统处理分布式事务有哪些经典解决方案 -
时卞卡前: 为了解决大家在实施分布式服务化架构过程中关于分布式事务问题的困扰,将基于支付系统真实业务中的经典场景来对“可靠消息的最终一致性方案”、“TCC两阶段型方案”和“最大努力通知型方案”这3种柔性事务解决方案进行具体设计实现和详细讲解. https://yq.aliyun.com/articles/69572

武城县15678399794: 为什么大部分NoSQL不提供分布式事务 -
时卞卡前: 像MongoDB, Cassandra, HBase, DynamoDB, 和 Riak这些NoSQL缺乏传统的原子事务机制,所谓原子事务机制是可以保证一系列写操作要么全部完成,要么全部不会完成,不会发生只完成一系列中一两个 写操作;因为数据库不提供这种事务...

武城县15678399794: 分布式事务怎么来实现?xa?cap?base -
时卞卡前: Java Transaction API和XA协议是Spring常用的分布式事务机制,不过你可以选择选择其他的实现方式.理想的实现取决于你的应用程序使用何种资源,你愿意在性能、安 全、系统稳健性、数据完整方面做出何种权衡.在这次JavaWorld大会上...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网