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.