Метод rollback класса Connection
Метод rollback класса Connection откатывает
текущую транзакцию, отменяя все изменения, которые были
выполнены с момента ее начала или последнего подтверждения.
Метод не принимает параметров и возвращает None.
После отката соединение остается открытым и готовым к
выполнению новых запросов.
Метод rollback полезен, когда нужно гарантировать,
что частично выполненные операции не попадут в базу данных.
Например, при обработке ошибки в середине транзакции можно
откатить все изменения и вернуть базу в исходное состояние.
Синтаксис
Connection.rollback()
Пример
Давайте создадим таблицу, вставим строку и откатим
транзакцию методом rollback:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'))
conn.commit()
trans = conn.begin()
conn.execute(text("INSERT INTO articles (title) VALUES ('article')"))
trans.rollback()
res = conn.execute(text('SELECT COUNT(*) FROM articles'))
print(res.scalar())
Результат выполнения кода:
0
Как видите, вставленная строка не попала в таблицу, потому что транзакция была откачена.
Пример
Давайте откатим транзакцию при возникновении ошибки в процессе выполнения запросов:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'))
conn.commit()
trans = conn.begin()
try:
conn.execute(text("INSERT INTO articles (title) VALUES ('article')"))
conn.execute(text('INSERT INTO nonexistent_table VALUES (1)'))
trans.commit()
except Exception:
trans.rollback()
res = conn.execute(text('SELECT COUNT(*) FROM articles'))
print(res.scalar())
Результат выполнения кода:
0
Первая вставка была отменена, так как вторая операция завершилась ошибкой и транзакция была откачена.
Пример
Давайте сравним поведение методов commit и
rollback на одном и том же наборе данных:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'))
conn.commit()
trans = conn.begin()
conn.execute(text("INSERT INTO articles (title) VALUES ('article 1')"))
trans.commit()
trans = conn.begin()
conn.execute(text("INSERT INTO articles (title) VALUES ('article 2')"))
trans.rollback()
res = conn.execute(text('SELECT title FROM articles'))
print(res.scalars().all())
Результат выполнения кода:
['article 1']
Первый запрос был подтвержден методом commit,
а второй отменен методом rollback.
Смотрите также
-
класс
Connection,
который представляет соединение с базой данных -
метод
commit,
который подтверждает текущую транзакцию -
метод
begin,
который начинает новую транзакцию -
метод
in_transaction,
который проверяет наличие активной транзакции