许多数据库管理系统使用一种称为“xa”的特殊2pc协议来进行分布式事务。为什么会有人使用xa?对我来说,xa不能保证在发生故障的情况下:
在xa中,事务管理器(tm)会告诉所有dbms在第一阶段准备,如果所有dbms都准备好了,tm会告诉所有dbms在第二阶段提交,否则如果任何一个dbms失败,tm会告诉其他dbms回滚。
如果所有dbms都在第一阶段准备好了,那么如果有人在第二阶段没有提交呢?在这种情况下,整个事务将失败,所有其他事务将不得不回滚(第三阶段?),从而使第一阶段失去意义。也就是说,即使所有的dbms都准备好了,第一阶段也不能保证(不过,它确实增加了一些成功的可能性)。
1条答案
按热度按时间fquxozlt1#
虽然你的问题看起来理论性比实际性强,但是
你说得对(从https://dev.mysql.com/doc/refman/8.0/en/xa-restrictions.html)
如果在服务器正在执行xa prepare、xa commit、xa rollback或xa commit时出现意外停止。。。在一个阶段语句中,服务器可能无法恢复到正确的状态,从而使服务器和二进制日志处于不一致的状态。
但是-那是关于mysql的,并用这个问题来标记这个问题:)
如果你想挖得更深,我想你应该跳到https://dba.stackexchange.com/