分布式事务?
分布式事务的方案:
1 两阶段提交的方案/xa方案。(这种方案不怎么用) 第一阶段 :询问。 第二阶段:执行。 spring + JTA 就可以实现。
这种方案是每个服务只能操作自己对应的数据库的,如果出现多个库这么一个操作是不合规的。
2 tcc 的方案 (try confirm cancel)分为三个阶段
1 try 阶段:这个阶段就是说对各个服务的资源做检测以及对资源进行锁定或者是预留
2 confirm 阶段: 这个阶段说的是在各个服务中执行实际的操作
3 cancel阶段: 如果任何一个服务的业务方法执行出错, 那么这里就需要进行补偿,就是执行已经执行成功的业务逻辑的回滚操作
和金钱相关的。这个方案最好使用这个方案。 严格保证钱的正确性
3 本地消息表
先系统A 的 数据写入到一个消息表中,在写入到mq 中,然后在通知系统B,先写入到系统B对应的消息表中,在更新自己的数据库。
大量的依赖mysql的消息表。 如果大的并发就不太行。
4 最终一致性的方案
使用RocketMQ 来实现。系统A来发送一个消息prepared 到rocketMQ 中,等到系统A 事务提交成功了,在发送RocketMQ中一个confirm消息,
这个时候系统B才会去消费这个消息,去提交自己的事务。
如果系统A发送确认的消息失败了。消息就停留在prepared状态, RocketMQ 会自动的轮询所有的消息,如果还是没有就回到系统A中的一个接口,
确认这个消息是回滚还是重新发送?