我相信大多数人知道什么是2PC(两阶段提交协议),以及如何在Java或大多数现代语言中使用它。 基本上,它是用来确保交易是同步的,当你有2个或更多的数据库。 假设我有两个DB(A和B)在两个不同的位置使用2PC。 在A和B准备提交事务之前,两个数据库都会向事务pipe理器报告,说他们已经准备好提交了。 所以当事务pipe理器被确认时,它会发回一个信号给A和B,告诉他们继续。 这是我的问题:比方说,A收到信号,并进行交易。 一旦一切完成,B即将做同样的事情,但有人拔掉电源线,导致整个服务器关机。 当B重新上线时,B会做什么? B怎么做? 请记住,A是承诺,但B不是,我们正在使用2PC(所以,2PC的devise停止工作,不是吗?)
我正在研究在分布式事务中两阶段提交是如何工作的。 我的理解是,在该阶段的最后阶段,事务协调器询问每个节点是否准备好提交。 如果大家都同意的话,那就告诉他们继续前进吧。 什么阻止了以下失败? 所有节点都回应他们准备提交 事务协调员告诉他们“继续并提交”,但其中一个节点在收到此消息之前崩溃 所有其他节点提交成功,但现在分布式事务已损坏 这是我的理解,当崩溃的节点回来,它的事务将被回滚(因为它从来没有得到提交消息) 我假设每个节点正在运行一个普通的数据库,不知道任何有关分布式事务。 我错过了什么?
我试图对链接的服务器运行SQL,但我得到的错误。 BEGIN DISTRIBUTED TRANSACTION SELECT TOP 1 * FROM Sessions OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.". Msg 7391, Level 16, State 2, Line 3 The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction. 提供者返回了两个错误: […]