Предположим, есть таблица в БД, подобная этой:
id code
a8e09395-771c-4c6b-bb49-4921eeaf3927 2018-1
726b1390-b502-11e8-96f8-529269fb1459 2018-2
7a7ac7a6-b502-11e8-96f8-529269fb1459 2018-3
81758ea6-b502-11e8-96f8-529269fb1459 2019-1
Предположим, что несколько клиентов пишут в эту таблицу.
Для столбца «код» мы хотим убедиться, что он соответствует шаблону строгий"year- nth этого года".
Каков правильный уровень изоляции транзакции, который должны использовать все клиенты?
---- обновление ---- 2018-09-11 11:31:24 ---------
START TRANSACTION;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET @code = (SELECT CODE
FROM hey
WHERE id = 123);
UPDATE hey
SET code = @code + 1
WHERE id = 123;
COMMIT;
Сделал быстрый тест с вышеуказанной транзакцией.
Я запустил 2 консоли, затем запустил приведенный выше код, я запустил их обе в строку, которая читает столбец кода.
Затем заставьте одного из них обновить столбец кода, он будет ждать блокировки.
Затем я заставлю другой обновить столбец кода, он будет тупиковым и отката.
Теперь блокировка первой разрешена, и она может зафиксировать.
Так похоже, что эта изоляция транзакции может помешать им наступить друг другу на ногу, верно?