JavaRush /Курси /SQL SELF /Основні команди для роботи з транзакціями: BEGIN

Основні команди для роботи з транзакціями: BEGIN, COMMIT, ROLLBACK

SQL SELF
Рівень 39 , Лекція 1
Відкрита

Щоб усі зміни в твоїй базі були під контролем і виконувались коректно, PostgreSQL юзає поняття транзакції. Це група SQL-операцій, які виконуються як одне ціле. Якщо щось пішло не так — зміни треба відкотити. Ось тут і заходять у гру команди BEGIN, COMMIT і ROLLBACK.

Команди транзакцій потрібні не просто для порядку — вони реально важливі для захисту даних від багів і збоїв. Коли ти виконуєш серію SQL-операцій, важливо бути впевненим, що все спрацює як треба: якщо одна команда не пройшла, база має повернутись у початковий стан. Це і є одна з головних причин, навіщо взагалі потрібні команди транзакцій — вони допомагають зберегти узгодженість даних.

Крім того, транзакції дають так звану атомарність: або всі зміни застосовуються разом, або не застосовується жодна. Такий підхід виключає ситуацію, коли база оновлена «наполовину» — наприклад, гроші списались, а товар не додали в замовлення.

Ну і, звісно, транзакції дають гнучкість. Ти можеш будувати складні ланцюжки дій, контролювати, коли їх зафіксувати COMMIT або відкотити ROLLBACK, і навіть робити точкові відкати через SAVEPOINT. Це все робить роботу з базою не тільки безпечною, а й реально керованою.

Команда BEGIN

Команда BEGIN каже PostgreSQL, що починається транзакція. Після її виконання всі зміни, які ти робиш, залишаються "на паузі" до того моменту, поки ти не завершиш транзакцію через COMMIT або не відкотиш зміни через ROLLBACK.

Класичний приклад: уяви, ти хочеш перекинути 100 одиниць валюти з одного рахунку на інший. Починаєш транзакцію з BEGIN:

BEGIN;
-- Почали транзакцію
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Зменшили баланс на рахунку 1
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- Збільшили баланс на рахунку 2
Важливо:

Поки ти виконуєш команди в рамках транзакції, інші користувачі бази не побачать твоїх змін. Вони стануть видимі тільки після COMMIT.

Команда COMMIT

Команда COMMIT завершує транзакцію і зберігає всі зміни, зроблені в її рамках, у базу. Після цієї команди зміни стають видимими для всіх.

Приклад завершення транзакції:

COMMIT;
-- Всі зміни в транзакції збережені

Тепер зміни балансу, які ми зробили вище, стали "постійними". Гроші успішно перекинуті.

Команда ROLLBACK

Якщо під час виконання транзакції ти помітив баг або вирішив відкотити зміни, можна юзати команду ROLLBACK. Вона скасовує всі операції, виконані після BEGIN.

Уяви, під час переказу грошей ти побачив, що на рахунку не вистачає коштів. Тоді транзакція відкочується:

BEGIN;
-- Почали транзакцію
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- Ой, баг: недостатньо коштів.
ROLLBACK;
-- Всі зміни скасовані, база повернута у початковий стан

Після ROLLBACK жодні зміни в базі не зберігаються. Це дуже зручно для запобігання фейлам.

Повний приклад: переказ грошей між рахунками

Давай зберемо все разом. Ось повний приклад транзакції — з перевіркою балансу, переказом грошей і можливістю відкату у випадку багу:

BEGIN;
-- Починаємо транзакцію

-- Перевіряємо баланс на рахунку
SELECT balance INTO current_balance FROM accounts WHERE account_id = 1;

-- Перевіряємо, чи достатньо коштів
IF current_balance >= 100 THEN
    -- Якщо коштів достатньо, робимо переказ
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
    COMMIT;
    -- Підтверджуємо зміни
ELSE
    -- Якщо коштів недостатньо, відкочуємо транзакцію
    ROLLBACK;
END IF;

Цей приклад показує, як команди транзакцій працюють разом для запобігання неузгодженості даних.

Важливо

IF THEN ELSE END IF — це операції збережених процедур, які ми розберемо трохи пізніше:P

Особливість налаштування автокомміта

У PostgreSQL за замовчуванням увімкнений режим автокомміта, тому якщо ти виконуєш команди поза явною транзакцією, вони одразу фіксуються в базі. Наприклад:

UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Зміни одразу зберігаються, навіть без COMMIT

Якщо хочеш керувати транзакціями вручну, радимо завжди юзати BEGIN для явного старту транзакції.

Ти можеш вимкнути автокомміт для поточної сесії через команду:

SET AUTOCOMMIT TO OFF;

Пам’ятай: якщо автокомміт вимкнений, то доведеться завершувати кожну сесію командою COMMIT або ROLLBACK.

Типові фейли при роботі з транзакціями

Пропущений COMMIT. Якщо ти забув виконати COMMIT, твої зміни залишаться незавершеними і зникнуть після завершення сесії.

Блокування. Поки транзакція не завершена, ресурси, які вона юзає, можуть залишатись заблокованими. Це може призвести до проблем із паралельним доступом до даних.

Зайвий ROLLBACK. Іноді розробники занадто обережні й відкочують транзакцію без потреби. Це веде до повторних обчислень і навантажує базу.

Завислі транзакції. Якщо ти почав транзакцію, але забув її завершити (ані COMMIT, ані ROLLBACK), це може призвести до зависання сесії й блокування ресурсів бази.

Практичне застосування

На співбесідах на позицію розробника або DBA (адмін бази) тебе можуть спитати про реалізацію транзакцій у PostgreSQL. Розуміння команд BEGIN, COMMIT і ROLLBACK показує твою здатність працювати з даними безпечно й ефективно.

На практиці транзакції особливо корисні для побудови надійних систем, наприклад, для обробки замовлень в інтернет-магазинах або нарахування бонусних балів у програмі лояльності.

Тепер, коли ти розібрався з базовими командами транзакцій, можемо рухатись далі й занурюватись у такі цікаві штуки, як використання SAVEPOINT і робота з рівнями ізоляції. PostgreSQL — це бездонне море можливостей, так що тримайся :)

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ