| ||||||
|
|
Справочное руководство по MySQL7.5.8.3 Блокировка следующего ключа: устранение проблемы с фантомом
7.5.8.3 Блокировка следующего ключа: устранение проблемы с фантомомПри блокировке на уровне строк в InnoDB используется алгоритм, который получил название блокировки следующего ключа. В InnoDB осуществляется блокировка на уровне строк, поэтому на время поиска или сканирования индекса таблицы устанавливается совместно используемая или эксклюзивная блокировка записей обрабатываемых индексов. Таким образом, более точно блокировку на уровне строк можно определить как блокировку индексных записей.
Блокировка, которая в InnoDB устанавливается на индексные записи, влияет
также на интервал перед этой индексной записью. Если у пользователя
имеется совместная или эксклюзивная блокировка записи R в индексе, то
другой пользователь не может вставить новую индексную запись перед R в
порядке следования индексов. Такая блокировка интервалов производится для
предотвращения так называемой проблемы с фантомом. Предположим, что
необходимо прочитать и заблокировать все дочерние записи с
идентификатором, превышающим 100, из таблицы SELECT * FROM CHILD WHERE ID > 100 FOR UPDATE;
Допустим, что создан индекс таблицы SELECT * FROM CHILD WHERE ID > 100 FOR UPDATE; еще раз, то в результате запроса будет выдана новая дочерняя запись. Это противоречит принципу изоляции транзакции: транзакция должна запускаться таким образом, чтобы считываемые ею данные не изменялись на протяжении выполнения транзакции. Если мы рассматриваем набор строк как элемент данных, то новая дочерняя ``запись-фантом'' нарушит этот принцип изоляции.
Когда InnoDB сканирует индекс, то возможна также блокировка интервалов
после последних записей в индексе. Именно это иллюстрируется в предыдущем
примере: блокировка, установленная InnoDB, предотвратит вставку в таблицу,
если Блокировку следующего ключа можно использовать для того, чтобы провести проверку уникальности значений в своей программе. Если данные считываются в режиме совместного доступа и отсутствует дубликат строки, которую необходимо вставить, то можно безопасно вставлять свою строку и быть уверенным, что благодаря блокировке следующего ключа, установленной на предшествующей строке во время чтения, будет предотвращена вставка дублирующейся строки. Таким образом, блокировка следующего ключа позволяет ``заблокировать'' отсутствие чего-либо в таблице.
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Copyright © 2008-2010 Prime Hosting |
Prime Hosting. Хостинг, VPS - Хостинг, Аренда серверов, dedicated server:Хостинг Реселлинг хостинга VPS - Хостинг Аренда серверов Dedicated server |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||