Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 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 старые операции были просто затёрты.

можно поставить авторасширение на файл табличного пространства UNDO и он будет увеличиваться, чтобы не допустить ошибки. Если весь объем активных транзакций поместится в UNDO, то проблем нет. В PostgreSQL тот же самый объем должен поместиться в блоки данных. Фактически нет разницы.

Переходить с Oracle на PostgreSQL?! Есть MariaDB с некоторой совместимостью с Oracle. И есть СберТех...

MariaDB это форк MySql. А СберТех… это что за база данных?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий