Locking table в MySQL

Блокировка таблиц в базах данных — очень удобный инструмент, благодаря которому можно избежать ошибок, связанных с обновлением данных в режиме реального времени.

Сегодня мы рассмотрим ограничение доступа к таблицам на время манипуляции с данными на примере базы данных MySQL.

Синтаксис

Выдержка синтаксиса из документации:

LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...

lock_type:
    READ [LOCAL]
  | [LOW_PRIORITY] WRITE

UNLOCK TABLES

Как мы видим, для блокировки таблиц используется всего одна простая команда. Эта команда может блокировать как одну, так и сразу несколько таблиц. И вот тут есть важный момент: если мы хотим использовать в транзакции несколько таблиц, нам следует заблокировать все эти таблицы.

Схема базы данных

Предположим, что у нас есть таблицы Users и Posts со следующей структурой:

Users

Навзание Тип Дополнительно
UserID int PK UQ AI NN
UserName varchar(32) NN
PostIteratorID int NN

Posts

Навзание Тип Дополнительно
UserID int PK NN
PostID int PK NN
Text text NN

Когда пользователь добавляет новый пост, происходит примерно следующий алгоритм:

  1. Блокируем таблицы Users и Posts
    LOCK TABLES Users WRITE, Posts WRITE;
  2. Получаем значение итератора ID постов пользователя из таблицы Users
    SELECT `PostIteratorID` FROM `Users` WHERE `UserID`=$UID;
  3. Инкрементируем ID поста
    $PostIteratorID++
  4. Обновляем таблицу Users новым значением
    UPDATE `Users` SET `PostIteratorID`=$PostIteratorID;
  5. Добавляем запись с новым ID поста в таблицу Posts
    INSERT INTO `Posts` SET `UserID`=$UID, `PostID`=$PostID, `TEXT`='$TEXT';
  6. По завершении работы с таблицами нам нужно снять с них блокировку
    UNLOCK TABLES;

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

Типы блокировок

В MySQL есть 2 типа блокировок:

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

Комментарии

Тут без вас никак. Поделитесь с нами вашими мыслями

Горячие вакансии