Sobes.tech
Senior

De ce este nevoie de SELECT FOR UPDATE în loc de synchronized? Și de ce blocarea pesimistă în loc de optimistă?

sobes.tech AI

Răspuns de la 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.