我有一个关于Paxos算法的特别问题,该算法在Cassandra的轻量级事务中实现:
如果两个节点同时发布相同的提案,会发生什么?他们都得到了'[applied]:true'吗
例如,考虑下表:
ids:
+-------------------+---------------+
| id_name (varchar) | next_id (int) |
+-------------------+---------------+
| person_id | 1 |
+-------------------+---------------+
这个查询:
UPDATE ids
SET next_id = 2
WHERE id_name = 'person_id'
IF next_id = 1
如果我执行这个查询,我会得到一个响应:
[{[applied]: True}]
如果我再次执行它,那么它将不会被接受,因为next_id!=1,我得到:
[{[applied]: False, next_id: 2}]
我的问题是,如果我从两个节点并行执行这个查询,会发生什么。他们两个都有机会被录取吗?
(我的用例在这个stackoverflow问题中进行了描述)
Paxos的效果是查询被"线性化":在两个不同的节点上的同一行上同时执行两个查询将导致其中一个在另一个之后执行。第二条将不适用。显然,两个查询都必须使用CAS才能工作。更多信息请点击此处。
两个查询不可能同时执行。对于每个查询,都会创建一个提案,用于基于paxos达成共识。这将基于与提案相关联的时间戳发生,其中相同的时间戳仍将导致两个提案中的一个失败。