两阶段提交如何在低级别真正工作?
How does Two Phase Commit really work at low level?
互联网上有大量关于 2 阶段提交的文章。
他们都在说同样的话,但我不明白。我需要对它有一个低层次的了解。
订单和支付服务示例是互联网上最流行的示例。
假设我们有订单服务和付款服务。下订单时,订单服务会将其写入其数据库,但支付服务也必须将其写入其自己的数据库才能完成交易。
以下是我的理解不足:
用户向 Orchestrator 发送下单请求
Orchestrator 同时调用订单服务和支付服务。现在根据我所读到的内容,订单和支付服务应该通过告诉它是否准备好来响应 Orchestrator。 这是什么意思?在这里准备好是什么意思?
订单和支付服务响应,告诉 Orchestrator 它们“准备就绪”(不管那是什么意思)。
Orchestrator 向两个服务发送另一个请求(提交请求)。
订单将记录写入其数据库。支付服务将记录写入自己的数据库。他们都以状态 200 响应 Orchestrator。
Orchestrator 检查两个参与者是否都返回了状态代码 200。如果是,则什么都不做。如果没有,那么它会要求他们中止? 怎么样?其中一位参与者已经将交易写入其数据库。
我会向您解释购买成功的步骤。客户注册订单,然后前往支付网关并在那里付款,然后 returns 到商店网站并记录付款记录,操作员可以跟踪这些步骤。
订单table
Id int,
CustomerName nvarchar(150),
TotalPrice int,
SendState tinyint,
InsertDate datetime
付款table
Id int,
OrderID int,
PayState tiniyint,
PayPrice int
客户现在在数据库中注册一个订单
Insert into Order values(1,'bill',30000,1,'5/1/2021 8:30:52 AM')
现在客户连接到支付网关并成功付款,商店网站returns。
Insert into Payment values(1,1,200,30000)
现在为操作员显示结果
select o.*,p.PayState,p.PayPrice
from Order o join Payment p on o.Id = p.OrderId
如果您不付款,将在数据库中记录错误 500,操作员看到 500 的状态,就会明白付款不成功。
Insert into Payment values(1,1,500,0)
两阶段提交都是关于处理失败及其含义。
在第 1 阶段,编排器告诉订单和支付服务准备提交。如果一切顺利,他们都会回复“准备好”,这意味着:
- 交易被持久记录,并标记为准备好
- 除了某些其他服务准备失败外,不可能由于冲突或任何其他原因需要回滚。事务准备好后,只有编排器才能正常回滚。
如果订单和支付处理器都成功准备,那么编排器将告诉他们完成提交。定案方式:
- 事务被持久记录并标记为已提交
- 它无法回滚。
如果在此过程中出现任何问题,可以检查支付和订单服务中持久记录的交易状态,以确定它是否“真实发生”以及如何恢复:
- 如果不是所有的服务都准备成功,那么交易就没有发生。编排器将回滚所有准备它的服务中的事务。如果出现问题,这可能需要手动干预,或者协调器可能无法完成此操作,直到一切恢复正常。
- 如果所有服务都准备成功,那么事务就发生了。编排器将告诉所有尚未完成的服务继续执行。同样,这可能必须等到关闭的系统重新启动。
此外,有时恢复不是协调器的工作。如果编排器放弃,则各个服务可以相互检查以查看事务是否发生。
重要的一点是,一旦两阶段提交开始,无论发生什么,您都可以通过检查持久事务记录return使系统处于一致状态。
实际上,两阶段提交并不经常使用,因为当事务处于准备但未完成状态时,任何其他使用其数据的事务都不能自己提交,因为它们可能需要回滚。这种事务需要相互等待的争用会减慢整个系统的速度。
互联网上有大量关于 2 阶段提交的文章。 他们都在说同样的话,但我不明白。我需要对它有一个低层次的了解。
订单和支付服务示例是互联网上最流行的示例。
假设我们有订单服务和付款服务。下订单时,订单服务会将其写入其数据库,但支付服务也必须将其写入其自己的数据库才能完成交易。
以下是我的理解不足:
用户向 Orchestrator 发送下单请求
Orchestrator 同时调用订单服务和支付服务。现在根据我所读到的内容,订单和支付服务应该通过告诉它是否准备好来响应 Orchestrator。 这是什么意思?在这里准备好是什么意思?
订单和支付服务响应,告诉 Orchestrator 它们“准备就绪”(不管那是什么意思)。
Orchestrator 向两个服务发送另一个请求(提交请求)。
订单将记录写入其数据库。支付服务将记录写入自己的数据库。他们都以状态 200 响应 Orchestrator。
Orchestrator 检查两个参与者是否都返回了状态代码 200。如果是,则什么都不做。如果没有,那么它会要求他们中止? 怎么样?其中一位参与者已经将交易写入其数据库。
我会向您解释购买成功的步骤。客户注册订单,然后前往支付网关并在那里付款,然后 returns 到商店网站并记录付款记录,操作员可以跟踪这些步骤。
订单table
Id int,
CustomerName nvarchar(150),
TotalPrice int,
SendState tinyint,
InsertDate datetime
付款table
Id int,
OrderID int,
PayState tiniyint,
PayPrice int
客户现在在数据库中注册一个订单
Insert into Order values(1,'bill',30000,1,'5/1/2021 8:30:52 AM')
现在客户连接到支付网关并成功付款,商店网站returns。
Insert into Payment values(1,1,200,30000)
现在为操作员显示结果
select o.*,p.PayState,p.PayPrice
from Order o join Payment p on o.Id = p.OrderId
如果您不付款,将在数据库中记录错误 500,操作员看到 500 的状态,就会明白付款不成功。
Insert into Payment values(1,1,500,0)
两阶段提交都是关于处理失败及其含义。
在第 1 阶段,编排器告诉订单和支付服务准备提交。如果一切顺利,他们都会回复“准备好”,这意味着:
- 交易被持久记录,并标记为准备好
- 除了某些其他服务准备失败外,不可能由于冲突或任何其他原因需要回滚。事务准备好后,只有编排器才能正常回滚。
如果订单和支付处理器都成功准备,那么编排器将告诉他们完成提交。定案方式:
- 事务被持久记录并标记为已提交
- 它无法回滚。
如果在此过程中出现任何问题,可以检查支付和订单服务中持久记录的交易状态,以确定它是否“真实发生”以及如何恢复:
- 如果不是所有的服务都准备成功,那么交易就没有发生。编排器将回滚所有准备它的服务中的事务。如果出现问题,这可能需要手动干预,或者协调器可能无法完成此操作,直到一切恢复正常。
- 如果所有服务都准备成功,那么事务就发生了。编排器将告诉所有尚未完成的服务继续执行。同样,这可能必须等到关闭的系统重新启动。
此外,有时恢复不是协调器的工作。如果编排器放弃,则各个服务可以相互检查以查看事务是否发生。
重要的一点是,一旦两阶段提交开始,无论发生什么,您都可以通过检查持久事务记录return使系统处于一致状态。
实际上,两阶段提交并不经常使用,因为当事务处于准备但未完成状态时,任何其他使用其数据的事务都不能自己提交,因为它们可能需要回滚。这种事务需要相互等待的争用会减慢整个系统的速度。