Вопрос проверяет понимание механизма таймаута блокировки в системах управления базами данных, который необходим для предотвращения взаимоблокировок и обеспечения отказоустойчивости транзакций.
Таймаут блокировки (lock timeout) — это критический параметр в системах управления базами данных, который определяет, как долго транзакция будет ждать, если запрашиваемый ею ресурс (например, строка, таблица, страница) уже заблокирован другой транзакцией. Без такого ограничения транзакция могла бы ожидать бесконечно, что привело бы к взаимоблокировкам (deadlock) и "зависанию" системы.
Когда транзакция A пытается изменить строку, которая уже заблокирована транзакцией B, СУБД приостанавливает выполнение A. Если время ожидания превышает установленный таймаут, система автоматически откатывает (rollback) транзакцию A и возвращает ошибку (например, "Lock request time-out period exceeded"). Это позволяет:
Таймаут блокировки используется во всех реляционных СУБД (PostgreSQL, MySQL, SQL Server, Oracle) и многих NoSQL-системах при работе с транзакциями. Он особенно важен в высоконагруженных приложениях, где множество параллельных операций конкурируют за одни данные.
-- В SQL Server устанавливаем таймаут в 5 секунд
SET LOCK_TIMEOUT 5000;
-- В PostgreSQL через параметр сессии
SET lock_timeout = '5s';
-- В приложении можно обработать ошибку таймаута
try {
// Выполнение запроса
} catch (SQLException e) {
if (e.getMessage().contains("lock timeout")) {
// Повторить операцию или уведомить пользователя
}
}Слишком маленький таймаут (например, 1 секунда) может приводить к частым откатам транзакций даже при временной нагрузке. Слишком большой (например, минута) — рискует создать deadlock и снизить отзывчивость системы. Типичные значения — от 3 до 30 секунд, в зависимости от бизнес-логики.
Вывод: Таймаут блокировки — это защитный механизм, который следует настраивать осознанно. Он полезен в любом приложении с параллельным доступом к данным, чтобы обеспечить стабильность и предсказуемость поведения при конфликтах.