Прямой ответ
Database transactions — группы операций, выполняемых как единое целое (transactions — «транзакции» — transactions — incident — «всё или ничего» — transactions), зачем: согласованность данных (transactions — «данные согласованы» — transactions — incident — «согласованность» — transactions — postgres — «ACID» — transactions); ACID свойства (transactions — «ACID» — transactions): (1) Atomicity (transactions — «атомарность» — transactions — incident — «всё или ничего» — transactions — postgres — «все операции или ни одной» — transactions — ACID — «атомарность» — transactions); (2) Consistency (transactions — «согласованность» — transactions — incident — «данные согласованы» — transactions — postgres — «ограничения соблюдены» — transactions — ACID — «согласованность» — transactions); (3) Isolation (transactions — «изолированность» — transactions — incident — «транзакции изолированы» — transactions — postgres — «уровни изоляции» — transactions — ACID — «изолированность» — transactions); (4) Durability (transactions — «долговечность» — transactions — incident — «данные сохранены» — transactions — postgres — «после commit» — transactions — ACID — «долговечность» — transactions); уровни изоляции (transactions — «уровни» — transactions): (1) Read Uncommitted (transactions — «чтение незафиксированных» — transactions — incident — «грязное чтение» — transactions — postgres — «самый низкий» — transactions — «dirty reads» — transactions); (2) Read Committed (transactions — «чтение зафиксированных» — transactions — incident — «только зафиксированные» — transactions — postgres — «по умолчанию в PostgreSQL» — transactions — «non-repeatable reads» — transactions); (3) Repeatable Read (transactions — «повторяющееся чтение» — transactions — incident — «одинаковые данные» — transactions — postgres — «выше read committed» — transactions — «phantom reads» — transactions); (4) Serializable (transactions — «сериализуемость» — transactions — incident — «последовательное выполнение» — transactions — postgres — «самый высокий» — transactions — «нет аномалий» — transactions); команды (transactions — «команды» — transactions): (1) BEGIN (transactions — «начало транзакции» — transactions — incident — «начало» — transactions — postgres — BEGIN (transactions — «начало» — transactions — postgres — «транзакция началась» — transactions); (2) COMMIT (transactions — «фиксация» — transactions — incident — «фиксация» — transactions — postgres — COMMIT (transactions — «фиксация» — transactions — postgres — «изменения сохранены» — transactions); (3) ROLLBACK (transactions — «откат» — transactions — incident — «откат» — transactions — postgres — ROLLBACK (transactions — «откат» — transactions — postgres — «изменения отменены» — transactions); когда использовать транзакции (transactions): несколько операций (transactions — «несколько операций» — transactions — incident — «несколько» — transactions — postgres), согласованность (transactions — «согласованность важна» — transactions — incident — «согласованность» — transactions — postgres), конкурентный доступ (transactions — «много пользователей» — transactions — incident — «конкурентный доступ» — transactions — postgres); антипаттерны: долгие транзакции (transactions — «транзакции длятся долго» — transactions — incident — «блокировки» — transactions — postgres — «короткие транзакции» — transactions), неправильный уровень изоляции (transactions — «уровень не подходит» — transactions — incident — «аномалии» — transactions — postgres — «правильный уровень» — transactions).
Практика: транзакции в PostgreSQL
BEGIN/COMMIT (transactions — BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT; (transactions — «транзакция» — transactions — postgres — «перевод денег» — transactions — postgres); ROLLBACK (transactions — BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; ROLLBACK; (transactions — «откат» — transactions — postgres — «изменения отменены» — transactions — postgres); Уровень изоляции (transactions — SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN; SELECT * FROM accounts WHERE id = 1; COMMIT; (transactions — «serializable» — transactions — postgres — «уровень изоляции» — transactions — postgres); Блокировки (transactions — SELECT * FROM accounts WHERE id = 1 FOR UPDATE; (transactions — «блокировка строки» — transactions — postgres — «FOR UPDATE» — transactions — postgres); Python (transactions — with conn.cursor() as cur: cur.execute("BEGIN"); cur.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1"); conn.commit() (transactions — «Python транзакция» — transactions — postgres — «Python» — transactions — Python).
Практический сценарий: перевод денег между счетами
Контекст: банковское приложение (postgres — перевод денег (incident — transactions), боль: согласованность (transactions — «деньги должны быть согласованы» — transactions — incident — «согласованность» — transactions — postgres); решение — database transactions: (1) BEGIN (transactions — BEGIN; (transactions — postgres — «начало транзакции» — transactions — postgres); (2) списание (transactions — UPDATE accounts SET balance = balance - 100 WHERE id = 1; (transactions — postgres — «списание» — transactions — postgres); (3) зачисление (transactions — UPDATE accounts SET balance = balance + 100 WHERE id = 2; (transactions — postgres — «зачисление» — transactions — postgres); (4) COMMIT (transactions — COMMIT; (transactions — postgres — «фиксация» — transactions — postgres); (5) атомарность (transactions — всё или ничего (transactions — «оба обновления или ни одного» — transactions — postgres — «атомарность» — transactions — ACID); (6) изоляция (transactions — уровень изоляции (transactions — SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; (transactions — postgres — «изолированность» — transactions — ACID); результат: перевод выполнен (transactions — «деньги переведены» — transactions — incident — «согласованно» — transactions — postgres — «атомарно» — transactions — «изолированно» — transactions); вывод: database transactions решили задачу (согласованность данных — transactions — ADR — «долгие транзакции» — антипаттерн — postgres — короткие транзакции — transactions — техдолг).
FAQ
Что такое database transactions и какие ACID свойства? Database transactions (transactions — группы операций (transactions — «транзакции» — transactions — incident — «всё или ничего» — transactions — postgres); ACID (transactions — свойства (transactions — «ACID» — transactions — incident — «свойства» — transactions — postgres): Atomicity (transactions — «атомарность» — transactions — incident — «всё или ничего» — transactions — postgres — ACID), Consistency (transactions — «согласованность» — transactions — incident — «данные согласованы» — transactions — postgres — ACID), Isolation (transactions — «изолированность» — transactions — incident — «транзакции изолированы» — transactions — postgres — ACID), Durability (transactions — «долговечность» — transactions — incident — «данные сохранены» — transactions — postgres — ACID); «без транзакций» — антипаттерн (несогласованность — postgres — транзакции обязательны — transactions — ADR — техдолг).
Какие уровни изоляции существуют и чем они отличаются? Уровни (transactions — изоляции (transactions — «уровни» — transactions — incident — «уровни изоляции» — transactions — postgres): Read Uncommitted (transactions — «чтение незафиксированных» — transactions — incident — «грязное чтение» — transactions — postgres — «самый низкий» — transactions), Read Committed (transactions — «чтение зафиксированных» — transactions — incident — «только зафиксированные» — transactions — postgres — «по умолчанию» — transactions), Repeatable Read (transactions — «повторяющееся чтение» — transactions — incident — «одинаковые данные» — transactions — postgres — «выше» — transactions), Serializable (transactions — «сериализуемость» — transactions — incident — «последовательное» — transactions — postgres — «самый высокий» — transactions); отличие: уровень изоляции vs производительность (transactions — «выше изоляция — ниже производительность» — transactions — incident — «баланс» — transactions — postgres — «выбор по задаче» — transactions — ADR — техдолг).
Как использовать транзакции в PostgreSQL?
Использование (transactions — команды (transactions — «команды» — transactions — incident — «команды» — transactions — postgres): BEGIN (transactions — BEGIN; (transactions — postgres — «начало» — transactions — postgres), операции (transactions — UPDATE accounts SET balance = balance - 100 WHERE id = 1; (transactions — postgres — «операции» — transactions — postgres), COMMIT (transactions — COMMIT; (transactions — postgres — «фиксация» — transactions — postgres), ROLLBACK (transactions — ROLLBACK; (transactions — postgres — «откат» — transactions — postgres); уровень изоляции (transactions — SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; (transactions — postgres — «уровень» — transactions — postgres); «без транзакций» — антипаттерн (несогласованность — postgres — транзакции обязательны — transactions — ADR — техдолг).
Как выбрать уровень изоляции и какие аномалии возможны? Выбор (transactions — уровень (transactions — «уровень изоляции» — transactions — incident — «выбор» — transactions — postgres); как: по задаче (transactions — «по задаче» — transactions — incident — «по задаче» — transactions — postgres — «баланс» — transactions), read committed (transactions — «по умолчанию» — transactions — incident — «по умолчанию» — transactions — postgres — «обычно достаточно» — transactions), serializable (transactions — «для критичных» — transactions — incident — «для критичных» — transactions — postgres — «когда важна согласованность» — transactions); аномалии (transactions — dirty reads (transactions — «грязное чтение» — transactions — incident — «dirty reads» — transactions — postgres — «read uncommitted» — transactions), non-repeatable reads (transactions — «неповторяющееся чтение» — transactions — incident — «non-repeatable» — transactions — postgres — «read committed» — transactions), phantom reads (transactions — «фантомное чтение» — transactions — incident — «phantom» — transactions — postgres — «repeatable read» — transactions); «неправильный уровень» — антипаттерн (аномалии — postgres — правильный уровень — transactions — ADR — техдолг).
Источники: PostgreSQL docs (transaction isolation, begin), Wikipedia (isolation) — ссылки в шапке.