Назад к вопросам
Senior
6
Без Hibernate, нативный SQL — как реализовать оптимистичную блокировку вручную?
Компании, где спрашивали
ТБанк
Ответ от нейросети
sobes.tech AI
Оптимистичная блокировка вручную с нативным SQL реализуется через контроль версии записи, обычно с помощью поля version или timestamp в таблице.
Алгоритм:
- При чтении записи сохраняете текущий
version. - При обновлении выполняете SQL-запрос с условием, что
versionне изменился:
UPDATE table_name
SET data = ?, version = version + 1
WHERE id = ? AND version = ?
- Если количество обновлённых строк равно 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("Данные были изменены другим пользователем");
}
Такой подход позволяет избежать блокировок на уровне базы и обнаруживать конфликты при параллельных изменениях.