Что делает Postgres, когда BEGIN запускается для соединения в режиме автоматической фиксации? - PullRequest
1 голос
/ 19 марта 2010

Я пытаюсь лучше понять концепцию 'autocommit' при работе с соединением Postgres (psycopg). Допустим, у меня свежее соединение, установите его уровень изоляции ISOLATION_LEVEL_AUTOCOMMIT, затем запустите этот SQL напрямую, без использования методов начала / отката курсора (в качестве упражнения; не говоря, что я на самом деле хочу это сделать):

INSERT A
INSERT B
BEGIN
    INSERT C
    INSERT D
ROLLBACK

Что происходит с INSERTs C & D?

Является ли autocommit чисто внутренней настройкой psycopg, которая влияет на то, как он запускает BEGINs? В этом случае вышеупомянутый SQL не подвержен уязвимости; ВСТАВКИ A & B фиксируются, как только они сделаны, в то время как C & D выполняются в транзакции и откатываются. На каком уровне изоляции выполняется транзакция?

Или автокоммит является реальной настройкой самого соединения? В таком случае, как это влияет на обработку BEGIN? Это игнорируется или переопределяет параметр автокоммит для фактического запуска транзакции? На каком уровне изоляции выполняется транзакция?

Или я полностью вне цели?

Ответы [ 3 ]

3 голосов
/ 19 марта 2010

Режим автоматической фиксации означает, что каждый оператор неявно начинает и заканчивает транзакцию.

В вашем случае, если автокоммит выключен:

  • Клиент неявно запустит транзакцию для первого оператора
  • BEGIN выдаст предупреждение о том, что транзакция уже запущена
  • ROLLBACK откатит все четыре утверждения

Когда автокоммит включен, откатываются только c и d.

Обратите внимание, что PostgreSQL не имеет внутреннего поведения AUTOCOMMIT, начиная с 8.0: все функции автоматической фиксации зависят от клиентов.

1 голос
/ 15 декабря 2010

Когда autocommit включен, psycopg просто отправляет все на сервер PostgreSQL, не пытаясь управлять транзакцией за вас. Если вы не используете BEGIN / COMMIT / ROLLBACK, то каждый вызов .execute () немедленно выполняется и фиксируется. Вы можете сделать свое собственное управление транзакциями, выполнив команды BEGIN / COMMIT / ROLLBACK. Очевидно, что в режиме автоматической фиксации вы не можете вызывать conn.commit () или conn.rollback (), потому что psycopg не отслеживает транзакции, а просто отправляет все, что вы .execute (), прямо на сервер.

В вашем примере A и B будут зафиксированы, C и D будут откатаны.

1 голос
/ 21 марта 2010

По умолчанию в PostgreSQL включен автокоммит, то есть каждый оператор обрабатывается как транзакция. Если вы явно скажете ему начать транзакцию, как в вашем примере, эти элементы находятся в новой транзакции.

В вашем примере, A и B будут зафиксированы, C и D будут откатаны.

...