SELECT LOCK В РЕЖИМЕ АКЦИИ
Я прочитал эту статью из dev.mysql.
на этой странице приведен пример того, что при использовании select для обновления и не использовать режим блокировки в режиме общего доступа и говорит
Здесь LOCK IN SHARE MODE не является хорошим потому что, если два пользователя счетчик в то же время, по крайней мере один из них заканчивается в тупике, когда он попытки обновления счетчика
но первая строка этой страницы говорит
SELECT... LOCK В РЕЖИМЕ АКЦИИ: прочитанные строки являются последними доступными, **, поэтому если они принадлежат к другой транзакции **который еще не совершил, читать блокирует до завершения этой транзакции.
есть ли парадокс?
i означает, что два пользователя не читают счетчик в то же время beacause
если они принадлежат к другой транзакции, прочитайте
блоков до завершения этой транзакции.
Ответы
Ответ 1
Если есть другая транзакция, которая изменила строку, ожидания SELECT... LOCK IN SHARE MODE ждут. Если строка не изменяется, она не ждет. Это приводит к первой ситуации: 2 транзакции могут SELECT... LOCK IN SHARE MODE, но ни один из них не может обновить запись (тупик)
Ответ 2
Попробуйте это. Откройте два терминала, например. powershell в Windows, xterm, консоль в Linux,... Подключение к MySQL:
создать таблицу child_codes (взято из документации по MySQL)
mysql> create table child_codes (counter_field integer);
Query OK, 0 rows affected (0.05 sec)
mysql> insert into child_codes set counter_field = 1;
Query OK, 1 row affected (0.00 sec)
session 1 (terminal 1): session 2 (terminal 2):
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select counter_field from child_codes
lock in share mode;
+---------------+
| counter_field |
+---------------+
| 1 |
+---------------+
1 row in set (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select counter_field from
child_codes lock in share mode;
+---------------+
| counter_field |
+---------------+
| 1 |
+---------------+
mysql> update child_codes set counter_field = 2;
ERROR 1205 (HY000): Lock wait timeout exceeded;
try restarting transaction
Я тоже думал, что если другая транзакция выполняет запрос select lock в режиме общего доступа, этот запрос блокируется (ожидая, что другая транзакция будет выполнена или откат). Но, как сказал Дархазер, если строка не изменена, она не ждет. Я считаю, что это поведение должно упоминаться в документации MySQL.