Sobes.tech
Назад к вопросам
Middle
905
questionbank

Что такое атомарность?

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

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();
}

Пояснение кода:

Код показывает атомарность на уровне транзакции базы данных.

  1. Отключается автокоммит, чтобы изменения не сохранялись по отдельности.
  2. Выполняется списание со счета отправителя.
  3. Выполняется зачисление на счет получателя.
  4. Если обе операции успешны, вызывается commit() — изменения фиксируются вместе.
  5. Если возникает ошибка на любом шаге, вызывается rollback() — база возвращается в исходное состояние.

Так достигается эффект «все или ничего».

Ключевые моменты:

  • Атомарность означает отсутствие частично выполненной операции.
  • Это одно из свойств ACID для транзакций.
  • При ошибке система должна откатить все уже сделанные изменения.
  • В многопоточности атомарность помогает избежать наблюдения промежуточного состояния.
  • Для Java и БД атомарность обычно обеспечивается транзакциями, а для отдельных операций — синхронизацией, Atomic*-классами и compare-and-set.