Подтвердить что ты не робот

SELECT LOCK В РЕЖИМЕ АКЦИИ

Я прочитал эту статью из dev.mysql.

на этой странице приведен пример того, что при использовании select для обновления и не использовать режим блокировки в режиме общего доступа и говорит

Здесь LOCK IN SHARE MODE не является хорошим потому что, если два пользователя счетчик в то же время, по крайней мере один из них заканчивается в тупике, когда он попытки обновления счетчика

но первая строка этой страницы говорит

SELECT... LOCK В РЕЖИМЕ АКЦИИ: прочитанные строки являются последними доступными, **, поэтому если они принадлежат к другой транзакции **который еще не совершил, читать блокирует до завершения этой транзакции.

есть ли парадокс?

i означает, что два пользователя не читают счетчик в то же время beacause если они принадлежат к другой транзакции, прочитайте  блоков до завершения этой транзакции.

4b9b3361

Ответ 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.