Sobes.tech
Назад к вопросам
Senior
6

Без Hibernate, нативный SQL — как реализовать оптимистичную блокировку вручную?

Компании, где спрашивали
ТБанк

Ответ от нейросети

sobes.tech AI

Оптимистичная блокировка вручную с нативным SQL реализуется через контроль версии записи, обычно с помощью поля version или timestamp в таблице.

Алгоритм:

  1. При чтении записи сохраняете текущий version.
  2. При обновлении выполняете SQL-запрос с условием, что version не изменился:
UPDATE table_name
SET data = ?, version = version + 1
WHERE id = ? AND version = ?
  1. Если количество обновлённых строк равно 0 — значит, кто-то изменил запись, и нужно обработать конфликт (например, повторить операцию или сообщить об ошибке).

Пример на Java с JDBC:

String sql = "UPDATE table_name SET data = ?, version = version + 1 WHERE id = ? AND version = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, newData);
ps.setLong(2, id);
ps.setInt(3, currentVersion);
int updated = ps.executeUpdate();
if (updated == 0) {
    throw new OptimisticLockException("Данные были изменены другим пользователем");
}

Такой подход позволяет избежать блокировок на уровне базы и обнаруживать конфликты при параллельных изменениях.