[
https://issues.apache.org/jira/browse/CASSANDRA-10011?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Philip Thompson resolved CASSANDRA-10011.
-----------------------------------------
Resolution: Invalid
Closing this ticket. The discussion on the mailing list has already been linked.
> I want to develop transactions for Cassandra and I want your feedback
> ---------------------------------------------------------------------
>
> Key: CASSANDRA-10011
> URL: https://issues.apache.org/jira/browse/CASSANDRA-10011
> Project: Cassandra
> Issue Type: New Feature
> Reporter: Marek Lewandowski
> Labels: features
>
> Hello everyone,
> *TL;DR;* I want to develop transactions (similar to those relational ones)
> for Cassandra, I have some ideas and I'd like to hear your feedback.
> *Long story short:* I want to develop prototype of solution that features
> transactions spanning multiple Cassandra partitions resembling those in
> relational databases. I understand that in Cassandra's world such
> transactions will be quite a bit different than in relational db world. That
> prototype or research if you will, is subject of my master's thesis.
> It's been some time since I've been dancing around that subject and
> postponing it, but what I understood in the process is that I cannot do
> anything useful being hidden from community's feedback. I want you to provide
> feedback on my ideas. You also have a power of changing it completely because
> first and foremost _I want to develop something actually useful, not only get
> my master's degree._
> To not scare anyone with huge wall of text, for now I'll just post very brief
> description of my ideas and longer block of text describing how I can see
> committing and rolling back data. I have more detailed descriptions prepared
> already, but I don't want to share 4 pages of text in one go.
> Scope of the project (assuming I'll do it alone) is an experiment, not
> production ready solution.
> Such experiment can use any tools possible to actually perform it.
> Baseline for any idea is:
> - asynchronous execution - think Akka and actors with non blocking execution
> and message passing
> - doesn't have to be completely transparent for end user - solution may
> enforce certain workflow of interacting with it and/or introduce new concepts
> (like akka messages instead of CQL and binary protocol).
> So far after reading a lot and thinking even more I have two ideas that I'd
> like to share.
> h3. Ideas are (with brief description, details will come later):
> h4. Idea 1: Event streaming
> - Imagine that every modiifcation is represented by an _Event_.
> - Imagine you can group these events into _Event Groups_.
> - Imagine that such groups are time series data
> - Imagine you can read such groups as a stream of events (think reactive
> stream)
> Idea is that: you don't need to lock data when you are sure there is no one
> else to compete with.
> There is 1 guy called _Cursor_ that reads Event Stream and executes Event
> Groups one by one advacing its position on the stream when Event Group has
> been executed.
> Seems like a system where you have only 1 transaction at any given time, but
> there are many areas to optimize that and to allow more than that. However
> I'll stop here.
> h4. Idea 2: Locking data
> - uses additional tables to acquire read/write locks
> - seperate tables to append modifications - as in "Rollback: Appending to
> seperate table."
> - supports different isolation levels.
> - more traditional approach, kind of translation of traditional locking to
> cassandra reality.
> -------------------------------------------------------------------------------------------
> Common part of two is approach to doing commit and rollback.
> h3. Doing Rollback and commit
> I have two ideas for rollback. I like 2nd one more, because it is simpler and
> potentially faster.
> h4. Rollback: Query rewriting
> It modifies original data, but before that it copies original data so that
> state can be restored. Then when failure is detected, modification query can
> be rewritten so that original data can be restored.
> Query rewriting seems like a complex functionality. I tried few simple and a
> little bit more complex statements and in general for basic stuff algorithm
> is not that complicated, but to support everything CQL has to offer it might
> be hard.
> Still such transactional system might have some restrictions over CQL
> statements used, because first of all when someone wants to have these
> transactions they already want something non standard.
> I will skip details of that approach for now.
> h4. Rollback: Appending to seperate table.
> Image we have table A that we want to have transactions on.
> This requires another table A_tx which has same schema as A, but has *1 more
> clustering column* and few new columns. A_tx will be additionally clustered
> by transaction id.
> New columns are:
> - {{is_committed boolean}}
> - {{is_rolledback boolean}}
> - {{is_applied boolean}}
> General idea is:
> 1. During transaction append changes to XXX_tx tables.
> 2. For rollback: nothing needs to be done (besides cleaning XXX_tx
> tables of useless data scheduled for rollback)
> 3. For commit: rows in each XXX_tx are marked as committed. This can be
> done using BATCH update so that all rows affected by transactions are
> committed. These changes will be eventually merged back into original row.
> Committed changes are visible during query, because query has to select from
> 2 tables. If you query for XXX table then you have to query that table, but
> also XXX_TX and get all committed data, merge result and return that to
> client.
> Here committed data eventually lands into proper row - during read as
> background process for example (this is this is_applied column) results are
> merged and inserted into original row, plus additionally modifications can be
> marked as _applied_.
> Uncommitted data can also be eventually cleaned up.
> *Important note:* since partitioning key stays the same for {{XXX}} table and
> {{XXX_TX}} table, data will reside on same nodes so that queries and
> application of data can be done locally.
> h3. What happens next
> Assuming I get any feedback I'll post more detailed descriptions of two
> approaches.
> I would love to hear your feedback on whole subject. Just to begin discussion
> and pick your interest.
> What you think about having more heavy transactions?
> Does this experiment has sense at all?
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)