Комментарии 6
такое поведение PostgreSQL может раздражать: представьте себе долгую транзакцию, в которой неверные входные параметры вызовут ошибку. Хотелось бы обработать ошибку, не откатывая всю транзакцию
Почему такое поведение должно раздражать? Как раз смысл транзакции в том, что она либо целиком выполняется, либо никак не выполняется. В этом плане именно Оракл странный. Для меня ещё странно подтверждать транзакцию при каждом коммите/инсерте. В остальных БД не "отсутствует отключение автокоммита", а нет такой дичи, как автотранзакция, просто каждая команда работает атомарно.
там про другое. Вы открыли транзакцию, набираете руками много команд, а в последней опечатываетесь и транзакцию нельзя зафиксировать, только откатить. Придется снова всё набирать. Это и раздражает:
postgres=# begin transaction;
BEGIN
postgres=*# create table t (n numeric);
CREATE TABLE
postgres=*# --- и много других команд, в следующей команде опечатка:
postgres=*# insert opechatka;
ERROR: syntax error at or near "opechatka"
LINE 1: insert opechatka;
^
postgres=!# commit;
ROLLBACK
postgres=# select * from t;
ERROR: relation "t" does not exist
В psql можно установить параметр, который это устраняет и psql работает "с виду" так же как Oracle:
postgres=# \set ON_ERROR_ROLLBACK interactive
postgres=# begin transaction;
BEGIN
postgres=*# create table t (n numeric);
CREATE TABLE
postgres=*# --- и много других команд, в следующей команде опечатка:
postgres=*# insert opechatka;
ERROR: syntax error at or near "opechatka"
LINE 1: insert opechatka;
^
postgres=*# commit;
COMMIT
postgres=# select * from t;
n
---
(0 rows)
транзакция успешно зафиксировалась, таблица создана. "с виду" потому, что за это платят тем, что перед КАЖДОЙ командой psql ставит SAVEPOINT. Каждая точка сохранения накручивает счетчик транзакций, который 32-битный. Если точек сохранения много (начиная с 64), начинается деградация производительности. Поэтому ON_ERROR_ROLLBACK = on не стоит ставить, ставят в interactive. В Oracle точки сохранения не ставятся, накладных расходов нет, просто сбойнувшая команда автоматически откатывается.
Это не прямо какое-то суперпремущество, но о таких мелочах поведения транзакций в PostgreSQL полезно знать. О них мало кто знает (например, про число 64), этому и посвящена статья.
Так как Oracle использует undo-log для восстановления состояния, а undo-log ограничен, то на длительных транзакциях в Oracle можно словить в любой момент ошибку snapshot too old, когда Oracle не смог восстановить состояние из-за того, что в undo-log старые операции были просто затёрты.
Переходить с Oracle на PostgreSQL?! Есть MariaDB с некоторой совместимостью с Oracle. И есть СберТех...
Сравнение транзакционных систем Oracle и PostgreSQL