There's quite a bit of literature on the topic. Look at what is in acmqueue and 
you'll see what others are saying is accurate.

To guarantee you need a distributed lock or a different design like datomic. 
Look at what rich hickey has done with datomic 



Sent from my iPhone

> On Sep 8, 2015, at 5:54 AM, DuyHai Doan <doanduy...@gmail.com> wrote:
> 
> "I could imagine that multiple paxos rounds could be played for different 
> partitions and these rounds would be dependent on each other" 
> 
> Example of cluster of 10 nodes (N1 ... N10) and RF=3.
> 
> Suppose a LWT with 2 partitions and 2 mutations M1 & M2, coordinator C1. It 
> will imply 2 Paxos rounds with the same ballot B1, one round affecting N1, 
> N2, N3 for mutation M1 and the other round affecting N4, N5 and N6 for 
> mutation M2.
> 
> Suppose that the prepare/promise, read/results phases are successful for both 
> Paxos rounds (see here for different LWT phases 
> http://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0)
> 
> The coordinator C1 then sends an propose() message to N1 ... N6 with 
> respective mutations M1 and M2. N1, N2 and N3 will reply accept() but imagine 
> another coordinator C2 has just proposed a higher ballot B2 (B2 > B1) for 
> nodes N4, N5 & N6 only. Those node will reply NoAck() (or won't reply) to C1. 
> 
> Then the whole multi-partition LWT will need to be aborted because we cannot 
> proceed with mutation M2. But N1, N2 and N3 already accepted the mutation M1 
> and it could be committed by any subsequent Paxos round on N1, N2 and N3
> 
> We certainly don't want that. 
> 
> So how to abort safely mutation M1 on N1, N2 and N3 in this case ? Of course 
> the coordinator C1 could send itself another prepare() message with ballot B3 
> higher than B1 to abort the accepted value in N1, N2 and N3, but we do not 
> have ANY GUARANTEE that in the meantime, there is another Paxos round 
> impacting N1, N2 and N3 with ballot higher than B1 that will commit the 
> undesirable mutation M1...
> 
> This simple example shows how hard it is to implement multi-partition Paxos 
> rounds. The fact that you have multiple Paxos rounds that are dependent on 
> each other break the safety guarantees of the original Paxos paper. 
> 
>  The only way I can see that will ensure safety in this case is to forbid any 
> Paxos round on N1 ... N6 as long as the current rounds are not finished yet, 
> and this is exactly what a distributed lock does.
> 
> 
> 
> 
> 
> 
> 
> 
> 
>> On Tue, Sep 8, 2015 at 8:15 AM, Marek Lewandowski 
>> <marekmlewandow...@gmail.com> wrote:
>> Are you absolutely sure that lock is required? I could imagine that multiple 
>> paxos rounds could be played for different partitions and these rounds would 
>> be dependent on each other.
>> 
>> Performance aside, can you please elaborate where do you see such need for 
>> lock?
>> 
>>> On 8 Sep 2015 00:05, "DuyHai Doan" <doanduy...@gmail.com> wrote:
>>> Multi partitions LWT is not supported currently on purpose. To support it, 
>>> we would have to emulate a distributed lock which is pretty bad for 
>>> performance.
>>> 
>>>> On Mon, Sep 7, 2015 at 10:38 PM, Marek Lewandowski 
>>>> <marekmlewandow...@gmail.com> wrote:
>>>> Hello there,
>>>> 
>>>> would you be interested in having multi-partition support for lightweight 
>>>> transactions in order words to have ability to express something like:
>>>> 
>>>> INSERT INTO … IF NOT EXISTS AND
>>>> UPDATE … IF EXISTS AND
>>>> UPDATE … IF colX = ‘xyz’
>>>> 
>>>> where each statement refers to a row living potentially on different set 
>>>> of nodes.
>>>> In yet another words: imagine batch with conditions, but which allows to 
>>>> specify multiple statements with conditions for rows in different 
>>>> partitions.
>>>> 
>>>> Do you find it very useful, moderately useful or you don’t need that 
>>>> because you have some superb business logic handling of such cases for 
>>>> example?
>>>> 
>>>> Let me know.
>>>> Regards,
>>>> Marek
> 

Reply via email to