2.分布式事务
指事务的操做位于不同的节点上,需要保证事务的ACID特性。例如在单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。
2PC
两阶段提交协议的设计出发点是允许任何一个参与者自行放弃它自己的那部分事务。由于事务原子性的要求,如果部分事务被放弃,那么整个分布式事务也必须被放弃。
两阶段提交(2PC),通过引入协调者(Coordinate)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。
1.运行过程
1.1准备阶段
协调者询问参与者事务是否执行成功,参与者发回事务执行的结果。
1.2提交阶段
如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。
需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接收到协调者发送来的通知后,才进行提交或者回滚。
2.存在的问题
2.1同步阻塞
所有事务参与者在等待其它参与者响应的时候都处于同步阻塞状态,无法进行其它操作。
2.2单点问题
协调者在2pc中起着非常大的作用,发生故障时将会造成很大的影响。特别是发生在第二阶段,所有参与者会一直等待,无法完成其它操作。
2.3数据不一致
在阶段二,如果协调者只发送部分commit消息,此时网络发生了异常,那么只有部分的参与者接受到commit消息,也是就是说只有部分参与者提交了事务,使得系统的数据不一致。
2.4太过保守
任意一个节点失败就会导致整个事务失败,没有完善的容错机制。
本地消息表
本地消息表与业务数据表处在同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。
1.在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。
2.之后将本地消息表中的消息转发到消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。
3.在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。