Проверяет понимание механизма блокировок строк в базах данных и их роли в обеспечении целостности данных при конкурентном доступе.
Блокировка строк — это механизм управления конкурентным доступом в реляционных базах данных. Когда транзакция хочет изменить строку, она получает исключительную блокировку, которая не позволяет другим транзакциям одновременно изменять или даже читать эту строку (в зависимости от уровня изоляции). Это гарантирует, что изменения будут последовательными и не потеряются.
Без блокировок две транзакции могут одновременно обновить одну и ту же строку, что приведёт к потере одного из обновлений. Например, если два пользователя одновременно увеличивают счёт на 100, итог может стать 100 вместо 200. Блокировки предотвращают такие аномалии, обеспечивая атомарность и изоляцию транзакций.
-- Транзакция 1
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- блокирует строку
UPDATE accounts SET balance = balance + 100 WHERE id = 1;
COMMIT; -- снимает блокировкуПока транзакция не завершена, другая транзакция, пытающаяся обновить ту же строку, будет ждать. Это может привести к взаимоблокировкам (deadlock), если блокировки захватываются в разном порядке.
Блокировки строк — фундаментальный инструмент для обеспечения целостности данных в многопользовательских системах. Их стоит применять всегда, когда возможен конкурентный доступ к данным, но важно проектировать транзакции так, чтобы минимизировать время удержания блокировок и избегать взаимоблокировок.