一、前提。
关于分布式事务,里面有个预提交的说法,而对于这个概念的描述,根据我查到的资料来说,就是:完成除了正式提交事务以外的其他事情(参与者执行事务中包含的操作,并记录undo日志(用于回滚)和redo日志(用于重放),但不真正提交)。
二、问题
对于上面的说法,我用一段下单的伪代码为例子(取消了DB的自动提交事务,然后写入sql语句)
`BEGIN
去订单表生成订单;
去库存表锁住库存并扣减库存;
COMMIT`
三、描述
根据上面的伪代码,预提交是否理解为:事务执行到库存那一步,停下来,如果成功锁住了订单表和库存表的相关数据。则向分布式事务框架的协调者这一角色返回成功的ack,然后分布式事务进入正式提交阶段,此时伪代码继续往下走,完成commit?
我在网上找到的资料,对于预提交这部分内容讲的比较少,不知道我这样理解对不对?如果不对,请指教,谢谢!
我理解“预提交”的核心思想是提前锁定资源。举个例子来说比如说在电商系统下单的时候,支付前会锁定库存,支付完成后会实际扣减库存,如果超时未支付则释放锁定的库存。
拿分布式事务中的
TCC
模式举例,也就是try/confirm/cancel。一般需要业务系统提供这三个接口,根据具体的业务场景来实现,如果拿电商下单的例子,那try就是锁定库存,confirm就是实际扣减库存,cancel就是释放库存。提供了这三个接口之后,还会有一个分布式事务调度系统来控制和协调多个系统的事务提交/回滚等操作。这个分布式事务调度系统一般是通过中间件的方式来实现的。
分布式事务解决的问题是多个系统间的一致性问题,因此理解分布式事务要从全局的角度去看,不能只站在单个系统的角度看。