Gymterview
junior

Как работают транзакции в PostgreSQL?

Транзакция — это последовательность операций, выполняемых как единое целое и удовлетворяющих свойствам ACID. В PostgreSQL каждый отдельный оператор — это неявная транзакция (autocommit), а для объединения нескольких операций используется BEGIN ... COMMIT/ROLLBACK.

Свойства ACID

  • Atomicity (атомарность) — транзакция либо выполняется полностью, либо не выполняется совсем
  • Consistency (согласованность) — транзакция переводит БД из одного согласованного состояния в другое
  • Isolation (изолированность) — параллельные транзакции не влияют друг на друга
  • Durability (долговечность) — результат зафиксированной транзакции сохраняется даже при сбое
Примеры работы с транзакциями
-- Явная транзакция
BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT;

-- Откат
BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
-- Что-то пошло не так
ROLLBACK;

-- Точки сохранения (savepoints)
BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
SAVEPOINT sp1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
-- Ошибка — откатываем до savepoint
ROLLBACK TO sp1;
-- Продолжаем с другой логикой
UPDATE accounts SET balance = balance + 1000 WHERE id = 3;
COMMIT;

Использование из Java/Spring

Пример
@Transactional
public void transfer(Long fromId, Long toId, BigDecimal amount) {
    accountRepository.debit(fromId, amount);
    accountRepository.credit(toId, amount);
    // при исключении — автоматический ROLLBACK
}

На собеседовании: не забудьте упомянуть autocommit: каждый отдельный SELECT/INSERT — это неявная транзакция. SAVEPOINT — продвинутый ответ, показывающий глубину знаний: позволяет откатить часть транзакции без полного ROLLBACK.