Что такое атомарность в контексте баз данных?

Ответ

Атомарность — это одно из свойств ACID, гарантирующее, что транзакция выполняется как единое целое: либо все её операции завершаются успешно, либо не выполняется ни одна. Невозможно частичное выполнение транзакции.

Практический пример на SQL (MySQL/PostgreSQL):

START TRANSACTION;
-- 1. Списать сумму со счета отправителя
UPDATE accounts SET balance = balance - 100.00 WHERE user_id = 1;
-- 2. Зачислить сумму на счет получателя
UPDATE accounts SET balance = balance + 100.00 WHERE user_id = 2;
-- Обе операции должны быть выполнены вместе
COMMIT;
-- Если между UPDATE произойдет ошибка, ROLLBACK отменит первую операцию

Пример реализации в PHP с PDO:

$pdo->beginTransaction();
try {
    $stmt1 = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE user_id = ?");
    $stmt1->execute([100.00, 1]);

    $stmt2 = $pdo->prepare("UPDATE accounts SET balance = balance + ? WHERE user_id = ?");
    $stmt2->execute([100.00, 2]);

    $pdo->commit(); // Фиксация обеих операций
    echo "Перевод выполнен атомарно.";
} catch (Exception $e) {
    $pdo->rollBack(); // Полный откат при любой ошибке
    echo "Ошибка перевода. Изменения отменены.";
}

Ключевой вывод: Атомарность защищает от состояний, когда деньги списались, но не зачислились, обеспечивая целостность данных.

Ответ 18+ 🔞

Слушай, объясняю на пальцах, что за зверь такой — атомарность. Представь, ты в баре пытаешься купить пиво. Достал сотку, положил на стойку. Бармен её взял, но пиво тебе не налил, а отвернулся к другой стопке. И стоит твоя сотка где-то в промежуточном состоянии — не у тебя, но и не в обмен на бутылку. Пиздец, да? Так вот атомарность — это про то, чтобы такого пиздеца не было. Либо вся операция прошла от начала до конца, либо нихуя не произошло. Как будто ты и не пытался.

Вот смотри на примере базы данных. Допустим, ты переводишь бабки с одного счёта на другой. Тут два шага: списать с одного, зачислить на другой. Если после списания сервер накрылся медным тазом, то получатель нихуя не получит, а у отправителя уже меньше. Это и есть та самая «хитрая жопа», которую атомарность лечит.

Практический пример на SQL (MySQL/PostgreSQL):

START TRANSACTION;
-- 1. Списать сумму со счета отправителя
UPDATE accounts SET balance = balance - 100.00 WHERE user_id = 1;
-- 2. Зачислить сумму на счет получателя
UPDATE accounts SET balance = balance + 100.00 WHERE user_id = 2;
-- Обе операции должны быть выполнены вместе
COMMIT;
-- Если между UPDATE произойдет ошибка, ROLLBACK отменит первую операцию

Видишь? START TRANSACTION — это как сказать базе: «Слушай, ща будет пачка операций, считай их одной большой хуйнёй». Пока ты не скажешь COMMIT, нихуя по-настоящему не сохранится. А если в середине что-то пошло не так — крикнул ROLLBACK, и всё, что было внутри, откатывается к чертям собачьим. Как будто и не было.

Пример реализации в PHP с PDO:

$pdo->beginTransaction();
try {
    $stmt1 = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE user_id = ?");
    $stmt1->execute([100.00, 1]);

    $stmt2 = $pdo->prepare("UPDATE accounts SET balance = balance + ? WHERE user_id = ?");
    $stmt2->execute([100.00, 2]);

    $pdo->commit(); // Фиксация обеих операций
    echo "Перевод выполнен атомарно.";
} catch (Exception $e) {
    $pdo->rollBack(); // Полный откат при любой ошибке
    echo "Ошибка перевода. Изменения отменены.";
}

Тут та же логика, только в коде. beginTransaction() — закуклились. Дальше пытаемся сделать два дела. Если оба прошли — commit(), и все изменения вступают в силу разом. Если же на любом этапе вылетела ошибка — мы попадаем в catch, делаем rollBack(), и состояние базы возвращается к моменту до beginTransaction(). Доверия ебать ноль к промежуточным результатам, и это правильно.

Ключевой вывод, ёпта: Атомарность — это твой бронежилет от сценария «деньги списались, но не доехали». Она гарантирует, что система никогда не окажется в этом ёбаном промежуточном состоянии, где уже не твоё, но ещё не чужое. Либо всё, либо ничего. Чистая целостность, без всяких полупидорских решений.