Which modern databases support ACID transactions?
foundationdb.com
foundationdb.com
That made me chortle. If you can't roll back an `ALTER TABLE` command (e.g., to back out of a failed schema migration), you don't really have good ACID semantics. Here's a list of other fun MySQL commands that sidestep transactions: http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html
It shouldn't require too crazy of an implementation to allow reads concurrent with schema modification (seeing the old version of the world) and it's not impossible to allow concurrent, transactional writes too.
Schema transactions are not nearly as useful/important as data transactions.
Actually, I think we are giving too much credit to Oracle! There are (relatively subtle, but real) concurrency anomalies in their so-called "serializable" isolation level.
This has a way of biting one in the ass in the worst possible moment, during a migration.
http://docs.oracle.com/cd/E17952_01/refman-5.1-en/implicit-c...
Edit - I was wrong!
Not only did I link to the wrong docs, but Oracle fixed what I considered to be a longstanding bug.
Thanks to those who pointed it out.
For a very, very long time, Oracle has enforced implicit transaction boundaries around DDL, and it is about time that finally changed.
--
[1] http://stackoverflow.com/questions/4692690/is-it-possible-to...
As of about 4 years ago Oracle's been the owners of MySQL, so that's the reason why you're seeing it hosted at docs.oracle.com.
Now, I know that _some_ databases offer some level of support to include DLL operations within a transaction, but its far from being common, and most of the implementations are quite recent.
Can you give an example?
If your app requires (edit: a significant amount of) transactions that have no locality, that is multiple arbitrary rows might be updated in any transaction, VoltDB might not be for you.
If I understand Spanner, it, too, has a somewhat-partitioned model, with parent/child relationships, correct?
1) VoltDB's global transactions are much slower than its partitioned transactions, but it's relative. It can still do hundreds or thousands per second.
2) Making this number faster for common cases is ongoing work. In upcoming 4.0, multi-partition consistent reads will get about a 10x performance boost if they're bottlenecked on transaction overhead. This allows us to do up to 50k/sec global reads while doing 500k/sec partitioned writes. Expect improvements for global writes in 2014.
Unfortunately the article is not a complete overview of the existing DBs landscape and has too much marketing in other places as well.
You are certainly correct that we have not provided a complete overview of the DB market! That is a very ambitious project. We built this page largely to call out the use of "ACID" terminology by vendors that don't actually provide it.
Galera looks like an extremely useful tool, and a big improvement on usual (and extremely dangerous) ad hoc failover. Besides the limited isolation level, though, it only really solves failover. Typical large scale database deployments will sacrifice even more ACID properties by sharding (which loses A, C, and I for shard-spanning transactions) and frequently by incoherent caching (which sacrifices isolation for reads that use the cache).
If MVCC (http://en.wikipedia.org/wiki/Multiversion_concurrency_contro...) is "weak", then are they claiming read/write locks are better?
Also, to nitpick, RavenDB's reads/writes in the document storage engine are entirely atomic. A lucene index is maintained in a secondary store which is eventually consistent. But as a document store supports ACID transactions.
'Snapshot isolation' is a level of isolation guarantee, not an implementation technique. It means that a transaction will read values consistently at one point in history and then write values at a later point, even though the read values may change in between. To give a classic example, pure snapshot isolation doesn't allow you to soundly transfer $100 from Alice's account to Bob's account. FoundationDB uses MVCC and optimistic concurrency, but provides serializable isolation.
Besides this, and the asynchronous indexing that you mention, RavenDB uses an "XA" type technique for cross-node transactions which relies on the durability of an external transaction coordinator. Various public statements of the developers lead me to think that they don't find this arrangement more trustworthy than I do.
"Local" transactions on a single document don't qualify as ACID transactions; that's one of the primary messages of the page you are linking to.
There is still some interesting information here, but there are some notable missing players here (MSSQL) who I presume are missing because not including them paints Foundation in a better light.
On the backend, Datomic doesn't implement it's own storage, it plugs into SQL databases, Riak, etc. so you may or may not have ACID at that level.
The Serializeable isolation level is used for data moves within the cluster according to the table referencing isolation levels and row visibility rules.