@Phys_Math_Man

Почему в базе данных PostgreSQL сохраняются незакоммиченные изменения?

cur.execute("DROP TABLE IF EXISTS users")
cur.execute("""CREATE TABLE IF NOT EXISTS users (
                id INTEGER )""")
cur.execute("INSERT INTO users VALUES (0);  COMMIT; INSERT INTO users VALUES (1)")
cur.execute("INSERT INTO users VALUES (2)")


В результате выполнения кода (здесь указан фрагмент, содержащий все сделанные запросы) в БД оказываются и те изменения, которые идут после COMMIT. Почему так?
  • Вопрос задан
  • 273 просмотра
Пригласить эксперта
Ответы на вопрос 3
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.

BEGIN начинает блок транзакции, то есть обозначает, что все операторы после команды BEGIN и до явной команды COMMIT или ROLLBACK будут выполняться в одной транзакции. По умолчанию (без BEGIN) Postgres Pro выполняет транзакции в режиме «autocommit» (автофиксация), то есть каждый оператор выполняется в своей отдельной транзакции, которая неявно фиксируется в конце оператора (если оператор был выполнен успешно; в противном случае транзакция откатывается).


https://postgrespro.ru/docs/postgrespro/10/sql-begin
Ответ написан
AshBlade
@AshBlade
Просто хочу быть счастливым
Абсолютно каждое выражение в оборачивается в транзакцию. Даже одиночное.

Каждый раз вызывая execute ты создаешь новую транзакцию - ты сейчас делаешь не одну транзакцию, а 4. Вручную все оберни в BEGIN...COMMIT
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
How psycopg2 autocommit works?
То есть когда con.autocommit = False транзакция начинается до cur.execute и закрывается после, а не внутри.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы