11 окт. 2011 г.

Камень в MySQL

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

Комментариев нет:

Отправить комментарий