You can't do dependent transactions in Calvin. Without experience building systems without dependent transactions, I'm worried that we may underestimate how much of an impact removing dependent transactions has on our ability to design working systems on time and under budget. This echoes earlier problems we had when everyone was building systems that didn't rely on database consistency... we often underestimated how difficult it was to build a working system without database consistency.
Basically, when you have a dependent transaction (i.e., a transaction where the write set depends on the results of earlier reads in the transaction), you split it into two separate transactions. The first transaction, the reconnaissance transaction, reads all the data necessary to determine the transaction's write set. Then the second transaction can declare the full read/write set based on the results of the recon transaction. While executing the second transaction, you verify that the data you're reading is the same as the data you read in the recon transaction; if it's not, you need to start the whole process over.
This is certainly unfortunate, because you have to perform every read twice. But perhaps it's performant enough. Have you tried using FaunaDB/Calvin for your workload? It sounds like FaunaDB has support for dependent transactions using OLLP baked in, but I'm curious to know if there's a significant performant hit to using it.
[0]: http://cs.yale.edu/homes/thomson/publications/calvin-sigmod1...
But my point was supposed to be positive. Doing something like 2PC or something like it only when it's needed is a huge improvement in the "pay for what you use" vein.
And for distributed shared systems, not all shards will have all of (a,b,c,d) in order to make a decision.
If one of the shards fails (i.e. write error) how would the transaction on the other shards abort? If there was shard redundancy I can see this becoming less likely, but by no means impossible.
Sure, maybe they can roll back transactions, but that presents a time window of wrong state to the world.
(1) http://www.cs.umd.edu/~abadi/papers/determinism-vldb10.pdf
(2) http://www.cs.umd.edu/~abadi/papers/calvin-tods14.pdf
(3) http://www.cs.umd.edu/~abadi/papers/determinism-eval.pdf
Aborts due to OLLP are state-based aborts, so other shards fail via the conditional logic described in the blog post.
(1) Calvin does support dependent transactions (it uses OLLP to support them.
(2) Calvin is just one example of a system that disallows arbitrary aborts. We've built a bunch of them in my lab.
(3) I do not believe that disallowing arbitrary aborts results in fundamentally new limitations of the system. You can still use pessimistic or optimistic concurrency control. You can use deterministic or nondeterministic systems. You don't have to assume you know the read-write set in advance. And you can certainly support dependent transactions.