cassandra-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ben Slater <ben.sla...@instaclustr.com>
Subject Re: Lightweight transaction inside a batch : request rejected
Date Tue, 25 Oct 2016 05:36:34 GMT
Yep, you would have to select the whole map and then pull out the
particular value you want in your application. I didn’t actually realise
you couldn’t just specify a particular map element in a select like you can
in an update but it appears there is a long running Jira for this:
https://issues.apache.org/jira/browse/CASSANDRA-7396

Cheers
Ben

On Tue, 25 Oct 2016 at 16:25 Mickael Delanoë <delanoemic@gmail.com> wrote:

> I can't do this, otherwhise i won't be able to query the item_id using a
> key with a query like :
> Select * from item_id_by_key where user_id=... and key=....
>
> Le 25 oct. 2016 07:15, "Ben Slater" <ben.slater@instaclustr.com> a écrit :
>
> Move item_id_by_key into a collection field in item table? (Would
> probably be a “better” C* data model anyway.)
>
> On Tue, 25 Oct 2016 at 16:08 Mickael Delanoë <delanoemic@gmail.com> wrote:
>
> Ok, I understand, thanks.
> So now i would like to know if there is some best practices to do what i
> want.
> I.e inserting entries in several tables (with same partition key) only if
> there is not already an entry in the main table.
>
> Keep in mind i wanted to do that inside a single batch because I can have
> 2 concurrent request trying to insert something different but with the same
> primary key in the main table.
>
> If i split the batch in 2 requests(1 with the LWT, 1 with the rest), how
> can i ensure the last batch won't override the previous data and that the
> whole data will be saved (in case of a problem between request1 and
> request2) ?
>
> Le 24 oct. 2016 12:47, "DuyHai Doan" <doanduyhai@gmail.com> a écrit :
>
>
>
> "So I guess in that case the Paxos operation does not span multiple table
> but operates only the table that has the condition. Am I wrong?"
>
> --> The fact that you're using a BATCH with LWT means that either ALL
> statements succeed or NONE. And to guarantee this, Paxos ballot must cover
> all statements. In your case since they span on multiple tables it's not
> possible
>
> On Mon, Oct 24, 2016 at 11:34 AM, Mickael Delanoë <delanoemic@gmail.com>
> wrote:
>
> Thanks DuyHai for the info.
> I already see this JIRA, however the use case I describe is slightly
> different from the JIRA as there is only ONE condition on ONE table. Other
> statements of the batch does not have any condition.
> So I guess in that case the Paxos operation does not span multiple table
> but operates only the table that has the condition. Am I wrong?
>
>
>
> 2016-10-24 10:21 GMT+02:00 DuyHai Doan <doanduyhai@gmail.com>:
>
> As far as I remember, there is an optimization in Cassandra to manage
> Paxos ballot per table. So asking a Paxos operation to span multiple tables
> (even if same partition key) would require a lot of changes in the current
> impl.
>
> The question has already been raised, you may want to convince the
> committers by adding some comments here:
> https://issues.apache.org/jira/browse/CASSANDRA-10085
>
> On Mon, Oct 24, 2016 at 9:58 AM, Mickael Delanoë <delanoemic@gmail.com>
> wrote:
>
> Hi,
>
> I would like to use lightweight transaction inside a batch but the request
> is rejected by cassandra, however I think this is a use case than could be
> handled without problem.
> Below is what I wanted to do.
>
> I am using cassandra 3.7.
>
> CREATE KEYSPACE test_ksp WITH replication = {'class': 'SimpleStrategy',
> 'replication_factor': '1'};
>
> CREATE TABLE test_ksp.item (
>     user_id bigint,
>     item_id text,
>     item_value text,
>     item_key1 text,
>     item_key2 text,
> PRIMARY KEY ((user_id), item_id));
>
> CREATE TABLE test_ksp.item_id_by_key (
>     user_id bigint,
>     item_key text,
>     item_id text,
> PRIMARY KEY ((user_id), item_key));
>
> USE test_ksp;
>
> BEGIN BATCH
> INSERT INTO item (user_id, item_id, item_value, item_key1, item_key2)
> values (1,'i11','item-C', 'key-XYZ-123', 'key-ABC-789') IF NOT EXISTS;
> INSERT INTO item_id_by_key (user_id, item_key, item_id) VALUES (1,
> 'key-XYZ-123', 'i11');
> INSERT INTO item_id_by_key (user_id, item_key, item_id) VALUES (1,
> 'key-ABC-789', 'i11');
> APPLY BATCH;
>
>
> So as you can see this is a batch that targets 2 tables but with the same
> partition key (i.e the same target nodes). Moreover It uses only ONE
> condition on one table only.
> I don't understand why cassandra returns an error "Batch with conditions
> cannot span multiple tables" in that case.
>
> I understand that if I had used several conditions on different tables it
> could be a problem, but in my case there is only one condition and moreover
> I have always the same partition key for every table inside the batch.
> As there is only one condition, I expected the paxos protocol just act on
> this condition and as the partition keys are all the same, the paxos
> protocol has only to work with the same replica nodes (not span across
> multiple partition).
> In my point of view this is as if the LWT was in a single statement,
> except that after the LWT is accepted a complete batch has to be executed.
>
> Is there someone that could explain why this use case need to be rejected
> by cassandra? And do you think this is something that cassandra could
> handle in a future version ?
>
> Regards,
> Mickaël
>
>
>
>
>
> --
> Mickaël Delanoë
>
>
>
>

Mime
View raw message