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

Почему нужен SELECT FOR UPDATE, а не synchronized? И почему пессимистичная блокировка, а не оптимистичная?

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

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

sobes.tech AI

SELECT FOR UPDATE используется для блокировки строк в базе данных на уровне транзакции, чтобы предотвратить конкурентное изменение данных другими транзакциями. В отличие от synchronized в Java, который блокирует объекты в памяти одного JVM, SELECT FOR UPDATE обеспечивает блокировку на уровне БД, что критично в распределённых системах с несколькими приложениями или инстансами.

Пессимистичная блокировка применяется, когда вероятность конфликтов высока и важно сразу предотвратить параллельные изменения, чтобы избежать ошибок и откатов. Оптимистичная блокировка подходит, когда конфликты редки, и система может позволить себе откаты и повторные попытки.

Пример использования SELECT FOR UPDATE в JDBC:

String sql = "SELECT balance FROM accounts WHERE id = ? FOR UPDATE";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
    ps.setInt(1, accountId);
    ResultSet rs = ps.executeQuery();
    if (rs.next()) {
        int balance = rs.getInt("balance");
        // обновляем баланс
    }
}
// изменения фиксируются в транзакции

Таким образом, SELECT FOR UPDATE обеспечивает надежную блокировку на уровне БД, что невозможно реализовать только средствами synchronized в Java.