Что такое атомарность?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Атомарность — это свойство операции выполняться целиком или не выполняться вовсе. Частичный результат не должен оставаться в системе. Обычно это объясняют на примере транзакций: либо все изменения зафиксированы, либо все отменены.
Определение:
Атомарность — одно из ключевых свойств транзакций в ACID. Она гарантирует, что набор действий рассматривается как единое неделимое целое: если какая-то часть не удалась, система откатывает все изменения, сделанные в рамках этой операции.
В многопоточной среде атомарность также означает, что операция выполняется без наблюдаемого промежуточного состояния для других потоков.
Пример использования:
Представим перевод денег между счетами: нужно списать сумму с одного счета и зачислить на другой. Если списание прошло, а зачисление нет, данные будут неконсистентны. Поэтому обе операции должны выполняться как одна транзакция.
Connection connection = dataSource.getConnection();
try {
connection.setAutoCommit(false);
try (PreparedStatement debit = connection.prepareStatement(
"UPDATE accounts SET balance = balance - ? WHERE id = ?");
PreparedStatement credit = connection.prepareStatement(
"UPDATE accounts SET balance = balance + ? WHERE id = ?")) {
debit.setBigDecimal(1, amount);
debit.setLong(2, fromAccountId);
debit.executeUpdate();
credit.setBigDecimal(1, amount);
credit.setLong(2, toAccountId);
credit.executeUpdate();
connection.commit();
} catch (Exception e) {
connection.rollback();
throw e;
}
} finally {
connection.close();
}
Пояснение кода:
Код показывает атомарность на уровне транзакции базы данных.
- Отключается автокоммит, чтобы изменения не сохранялись по отдельности.
- Выполняется списание со счета отправителя.
- Выполняется зачисление на счет получателя.
- Если обе операции успешны, вызывается
commit()— изменения фиксируются вместе. - Если возникает ошибка на любом шаге, вызывается
rollback()— база возвращается в исходное состояние.
Так достигается эффект «все или ничего».
Ключевые моменты:
- Атомарность означает отсутствие частично выполненной операции.
- Это одно из свойств ACID для транзакций.
- При ошибке система должна откатить все уже сделанные изменения.
- В многопоточности атомарность помогает избежать наблюдения промежуточного состояния.
- Для Java и БД атомарность обычно обеспечивается транзакциями, а для отдельных операций — синхронизацией,
Atomic*-классами и compare-and-set.