Давно хотел полить ядом реализацию 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 лочатся не строки, а индексы — но больше похоже, что Монти держит нас за идиотов.
Комментариев нет:
Отправить комментарий