一、事务概念
事务是用来保证一组数据操作的完整性和一致性。
四个特性(ACID):
原子性:事务中的数据操作是一个完整的个体,不可能再被分隔了
一致性:事务中的数据操作要么同时成功,要么同时失败
隔离性:事务与事物之间的数据操作是不相间的
持久性: 事务成功后对数据的修改是永久的。
二、分布式事务
1. 分布式事务就是将多个节点或服务的数据操作看成一个整体处理。
比如扣库存,下订单,支付分别是三个微服务,可以当成一个整体来处理,同时成功,同时失败。
2. 分布式事务一般由事务参与者(参与的微服务或节点),资源服务器(一般指事务的需要改变的数据),事务管理器(用来告诉各个事务参与者成功或者失败)。
三、分布式事务实现思路(其他分布式事务都是基于两段式事务基础上演变的)
两段式事务(2PC)与三段式事务(3PC)
基于XA的分布式事务
基于消息的最终一致性方案
TCC编程式补偿性事务(最好的实现方式)
但是第二阶段如果有一个资源管理器(服务节点)挂掉了,我们会不知道是提交前失败了还是提交后失败了,这是两段式事务的缺点之一。因此三段式事务在提交的时候做了一个提交预状态,即通知提交,已准备提交,提交,弥补两段式这个缺点。
基于XA的分布式事务(用处不多,但是mysql、oracle、db2等数据库事务的数据模型能够看到XA这种模型)
基于消息的最终一致性方案(业务系统中应用广泛)
但这种方案具有强一致性,比如A系统为支付系统,A通过消息中间件给B系统(假如修改订单状态)发送消息,A系统会先等待B系统的事务是否处理成功,成功了A系统才会将钱打给支付宝(通过线程睡眠可以实现),失败了就不执行支付业务了,所以一定是一起成功一起失败,但这也是一个缺点。
TCC柔性补偿事务(使用也很广泛):
举例服务A为扣减库存,服务B为下订单,这里会写TCC三个接口的内容,事务启动后,先调用Try尝试接口把订单创建好,库存也扣除,然后告知事务协调器A和B是否成功,都成功则会调用Confirm接口,有一个失败就会调用Cancel接口,取消创建的订单和恢复库存(即为补偿性)。
这里重点比较一下基于消息的最终一致性方案和TCC柔性补偿事务: