Метод rollback класса AsyncConnection
Метод rollback класса AsyncConnection
откатывает текущую транзакцию, открытую
в асинхронном соединении. Все изменения,
выполненные в рамках этой транзакции,
будут отменены. Метод не принимает
параметров и является асинхронным, поэтому
его нужно вызывать через await.
Метод полезен, когда нужно отменить изменения при возникновении ошибки или при нарушении бизнес-логики. После отката соединение остается открытым, и его можно использовать для новых транзакций.
Синтаксис
await connection.rollback()
Пример
Давайте создадим асинхронный движок,
откроем соединение, начнем транзакцию
и откатим ее методом rollback:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
await conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'))
await conn.commit()
await conn.begin()
await conn.execute(text("INSERT INTO articles (title) VALUES ('article')"))
await conn.rollback()
res = await conn.execute(text('SELECT COUNT(*) FROM articles'))
print(res.scalar())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
0
Как видите, вставка строки была отменена, и в таблице осталось ноль записей.
Пример
Давайте покажем откат транзакции при возникновении ошибки:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
await conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'))
await conn.commit()
try:
await conn.begin()
await conn.execute(text("INSERT INTO articles (id, title) VALUES (1, 'article')"))
await conn.execute(text("INSERT INTO articles (id, title) VALUES (1, 'user')"))
await conn.commit()
except Exception as error:
await conn.rollback()
print('Rollback:', type(error).__name__)
res = await conn.execute(text('SELECT COUNT(*) FROM articles'))
print(res.scalar())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
Rollback: IntegrityError
0
Обе вставки были отменены, так как вторая нарушила ограничение первичного ключа.
Смотрите также
-
класс
AsyncConnection,
который представляет асинхронное соединение с базой -
метод
commit,
который фиксирует текущую транзакцию -
метод
begin,
который начинает новую транзакцию -
метод
close,
который закрывает асинхронное соединение