Autocommit - режим, у якому кожна команда - окрема транзакція: вона або виконується й одразу фіксується, або відкочується при помилці. Це поведінка PostgreSQL і більшості драйверів за замовчуванням.
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- уже закомічено
UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- окрема транзакція
Якщо між двома командами щось впаде, гроші спишуться, але не зарахуються.
Явна транзакція об'єднує команди:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
Що варто знати:
- Одна команда атомарна й без
BEGIN:UPDATE ... WHERE id IN (1, 2)абоINSERTз кількома рядками виконається повністю або ніяк. - Тригери й каскадні дії виконуються в межах тієї самої транзакції, що й команда, яка їх запустила.
- Незавершена транзакція (забули
COMMIT) тримає блокування й заважає вакууму. Сесія в станіidle in transaction- поширена проблема на проді. - У PHP: PDO працює в autocommit, доки не викликати
beginTransaction(). LaravelDB::transaction(fn () => ...)робитьBEGIN/COMMITіROLLBACKпри винятку.
Неявні транзакції в інших СУБД: в Oracle й у SQL Server з IMPLICIT_TRANSACTIONS транзакція починається сама з першою командою й триває до явного COMMIT. А в MySQL DDL-команди (ALTER TABLE) неявно комітять поточну транзакцію - у PostgreSQL DDL транзакційний і відкочується разом з рештою.