Какие проблемы могут возникнуть, если не реализована блокировка?sql-42

Отсутствие блокировок в SQL-системах может привести к серьезным проблемам, особенно в многопользовательской среде с высокой конкуренцией за данные. Рассмотрим основные проблемы:

1. Потерянные обновления

-- Сессия 1: Читает значение (допустим, 100)
SELECT balance FROM accounts WHERE id = 1;

-- Сессия 2: Читает то же значение (100)
SELECT balance FROM accounts WHERE id = 1;

-- Сессия 1: Увеличивает на 50 (100 + 50 = 150)
UPDATE accounts SET balance = 150 WHERE id = 1;

-- Сессия 2: Уменьшает на 30 (100 - 30 = 70)
UPDATE accounts SET balance = 70 WHERE id = 1;

Результат: последнее обновление (70) перезапишет первое (150), и изменение от Сессии 1 будет потеряно.

2. "Грязное" чтение

Чтение незафиксированных данных, которые могут быть отменены:

-- Сессия 1:
BEGIN;
UPDATE accounts SET balance = 200 WHERE id = 1; -- Не коммитит

-- Сессия 2:
SELECT balance FROM accounts WHERE id = 1; -- Видит 200

Если Сессия 1 сделает ROLLBACK, Сессия 2 будет работать с несуществующими данными.

3. Неповторяемое чтение

-- Сессия 1:
SELECT balance FROM accounts WHERE id = 1; -- Возвращает 100

-- Сессия 2:
UPDATE accounts SET balance = 150 WHERE id = 1;
COMMIT;

-- Сессия 1:
SELECT balance FROM accounts WHERE id = 1; -- Теперь 150

Одно и то же чтение в одной транзакции дает разные результаты.

4. Фантомное чтение

-- Сессия 1:
SELECT COUNT(*) FROM accounts WHERE balance > 100; -- Возвращает 5

-- Сессия 2:
INSERT INTO accounts (id, balance) VALUES (11, 200);
COMMIT;

-- Сессия 1:
SELECT COUNT(*) FROM accounts WHERE balance > 100; -- Теперь 6

Появляются "фантомные" строки, которых не было при первом чтении.

5. Деадлоки

Хотя деадлоки обычно связаны с блокировками, их отсутствие или неправильная реализация могут увеличить вероятность:

-- Сессия 1:
UPDATE accounts SET balance = 100 WHERE id = 1;
-- Ждет блокировки id=2

-- Сессия 2:
UPDATE accounts SET balance = 200 WHERE id = 2;
-- Ждет блокировки id=1

Без правильной стратегии блокировок такие ситуации будут возникать чаще.

6. Проблемы согласованности данных

Отсутствие блокировок может привести к нарушению бизнес-правил, например:

  • Отрицательные балансы
  • Нарушение уникальности
  • Нарушение ссылочной целостности

7. Проблемы производительности

Парадоксально, но отсутствие блокировок может ухудшить производительность:

  • Повторные попытки операций из-за конфликтов
  • Необходимость сложных механизмов восстановления
  • Потеря результатов работы

Резюмируем: Реализация правильной стратегии блокировок (оптимистичных или пессимистичных) критически важна для обеспечения целостности данных, согласованности и предсказуемости работы приложения в многопользовательской среде.