Давно хотел полить ядом реализацию MVCC в замечательном MySQL (и MariaDB с XtraDB тоже):
mysql Ver 14.14 Distrib 5.5.15
tx-A> CREATE TABLE make_deadlock (id int PRIMARY KEY,
sid int,
num int,
INDEX (num)
) ENGINE=INNODB;
tx-A> INSERT INTO make_deadlock VALUES (1, 1, 1);
-- Поехали!
tx-A> BEGIN;
tx-B> BEGIN;
tx-A> UPDATE make_deadlock SET num = num + 1 WHERE id = 1;
tx-B> UPDATE make_deadlock SET num = num + 1 WHERE sid = 1;
-- Транзакция B ожидает A, понятное дело.
tx-A> UPDATE make_deadlock SET num = num + 1 WHERE sid = 1;
tx-B> ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
-- WTF?!
Две транзакции не поделили одну строчку, какая прелесть. Причина, конечно, простая — в этой гениальной реализации MVCC лочатся не строки, а индексы — но больше похоже, что Монти держит нас за идиотов.