由于任何特定数据集都没有主服务器(源),因此组中的每个服务器都可以随时执行事务,甚至是更改状态的事务(RW 事务)。
任何服务器都可以在没有任何先验
协调
的情况下执行事务。但是,在提交时,它会与组中的其余服务器协调,以就该事务的命运做出决定。这种协调有两个目的:(i) 检查事务是否应该提交;(ii) 并传播更改,以便其他服务器也可以应用该事务。
由于事务是通过原子广播发送的,因此组中的所有服务器都接收到该事务,或者都没有。如果他们收到了它,那么他们都会以与之前发送的其他交易相同的顺序收到它。冲突检测是通过检查和比较写入事务集来执行的。因此,它们是在行级别检测到的。冲突解决遵循第一个提交者获胜的规则。如果 t1 和 t2 在不同的站点同时执行,因为 t2 在 t1 之前排序,并且都更改了同一行,那么 t2 赢得冲突,t1 中止。换句话说,t1 试图更改已被 t2 呈现为陈旧的数据。
笔记
如果两个事务必然经常发生冲突,那么最好在同一台服务器上启动它们。然后他们有机会在本地锁管理器上同步,而不是稍后在复制协议中中止。