Вопрос

Я читаю руководство о транзакциях InnoDB, но все же, у меня есть много неясных вещей. Например, я не совсем понимаю следующее поведение:

-- client 1                             -- client 2
mysql> create table simple (col int) 
       engine=innodb; 

mysql> insert into simple values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into simple values(2);
Query OK, 1 row affected (0.00 sec)

mysql> select @@tx_isolation;                                                              
+-----------------+                                                                         
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |                                                                         
+-----------------+

mysql> begin;                                    
Query OK, 0 rows affected (0.01 sec)            
                                        mysql> begin;
                                        Query OK, 0 rows affected (0.00 sec)

mysql> update simple set col=10 where col=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

                                         mysql> update simple set col=42 where col=2;
                                         -- blocks

Теперь последняя команда обновления (в клиенте 2) ждет. Я ожидаю, что команда выполнит, потому что я предполагаю, что только строка 1 заблокирована. Поведение одинаково, даже если вторая команда в клиенте 2 insert. Анкет Может ли кто -нибудь описать фон блокировки этого примера (где и почему замки)?

Это было полезно?

Решение

InnoDB устанавливает определенные типы замков следующим образом.

  • Выберите ... из -за согласованного чтения, чтение снимка базы данных и настройка без блокировки, если уровень изоляции транзакции не установлен на сериализуемый. Для сериализуемого уровня наборы поиска обмениваются блокировками следующего ключа в записях об индексе, с которыми он встречается.

  • Выберите ... из ... заблокировать в режиме общего режима наборы общих блокировок следующего ключа во всех индексах записывают встречи поиска.

  • Для записи индекса записывания поиска выберите ... из ... для обновления блокируют другие сеансы от выбора ... из ... заблокировать в режиме общего или чтение на определенных уровнях изоляции транзакций. Последовательные чтения будут игнорировать любые блокировки, установленные в записях, которые существуют в представлении чтения.

  • Обновление ... где ... устанавливает эксклюзивную блокировку следующего ключа на каждой записи, которые встречаются в поисках.

  • Удалить из ... где ... Устанавливает эксклюзивный блокировку следующего ключа на каждой записи, которые встречаются в поисках.

  • Вставка устанавливает эксклюзивную блокировку в вставленную строку. Этот блокировка является блокировкой индекса, а не блокировкой следующего ключа (то есть нет блокировки зазора) и не мешает другим сеансам вставить в разрыв перед вставленной строкой.

Innodb имеет несколько типов записей на уровне:

  • Запись блокировки: это блокировка на индексной записи.

  • Замок зазора: это блокировка на разрыве между записями индекса или блокировкой на разрыве до первой или после последней записи индекса.

  • Замок следующего ключа: это комбинация блокировки записей на записи индекса и блокировки зазора на пробеге перед записью индекса.

Узнать больше :

Избегая фантомной проблемы с использованием блокировки следующего ключа

Избегая тупика

Другие советы

YperCube имеет это правильно. В частности, без уникального индекса, который используется в условиях, он будет блокировать больше, чем затронут единый ряд.

Чтобы увидеть поведение, которое вы ожидаете, измените создание вашего стола на это:

create table simple (col int unique) ENGINE=InnoDB;

Уникальный индекс на col Поле позволит ему заблокировать только затронутую строку.

«Для записи индекса записывания поиска выберите ... из ... для обновления блокируют другие сеансы от выбора ... из ... заблокировать в режиме общего доступа или от чтения на определенных уровнях изоляции транзакций. Последовательные чтения будут игнорировать любые замки установить на записях, которые существуют в представлении чтения »

Каковы эти определенные блокировки, которые можно применить с помощью Select для обновления, чтобы другие сеансы не могли прочитать заблокированную запись?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top