Oleg Atamanenko

thoughts about programming

Кратко о блокировках в БД

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

Существует два вида блокировок - оптимистичная и пессимистичная.

Оптимистичная блокировка

При оптимистичной блокировке на базе данных реальной блокировки не происходит. Вместо этого используется следующий подход - если во время выполнения транзакции она изменяет данные, которые были изменены после её начала, то транзакция прерывается с исключением. Использование оптимистичных блокировок позволяет избежать взаимных блокировок (dead-lock). Для реализации оптимистичной блокировки часто используется версионирование данных - в таблицу добавляется колонка, которая хранит текущую версию. При выполнении update в запросе в секции where передается версия данных, которая была забрана на изменение. Если update вернул 0 изменённых строк, значит данные были уже изменены и транзакцию необходимо запускать заново. Вместо версии можно хранить время последнего изменения данных.

Пессимистичная блокировка

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

  1. блокировка при чтении
  2. блокировка при записи

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

При блокировке при записи блокировка даных происходит при их обновлении в базе данных до конца текущей транзакции.

Блокировка с данных снимается либо при коммите, либо при откате транзакции.

Сравнение оптимистичных и пессимистичных блокировок

При разработке программного обеспечения необходимо выбирать стратегию блокировок данных. При этом следует учитывать следующее:

  1. Если ситуация обновления одних и тех же данных в один момент времени относительно редка, то выгоднее использовать оптимистичную блокировку. В этом случае не будут происходить дорогая операция блокировки ресурсов.
  2. Если же возможность возникновения ситуации обновления одних и тех же данных достаточно высока, то лучше использовать пессимистичную блокировку, это снизит количество прерванных транзакций.
  3. Также следует учитывать, что при оптимистичной блокировке в случае прерывания транзакции её нужно запускать заново.