@oslik_ppc

Есть ли разница между asyncsession.begin() и session.commit()?

Привет! Пытаюсь разобраться с asyncIO в SQLAlchemy, и тут возник вопрос, например при создании объекта в БД, есть два варианта, подскажите в чем разница?
1. Использование commit(), и один контекст менеджер
async with async_session() as session:
result = await session.execute(select(A).where(A.id == 1))
a1 = result.scalars().one()
a1.data = "new data"
await session.commit()
2. Без commit(), но используется два вложенных менеджера:
async with async_session() as session:
async with session.begin():
session.add_all(
[
A(bs=[B(), B()], data="a1"),
A(bs=[], data="a2"),
A(bs=[B(), B()], data="a3"),
]
)
Во втором, после выхода из менеджера происходит авто-коммит, но какая разница между этими подходами?
  • Вопрос задан
  • 677 просмотров
Решения вопроса 1
Zagir-vip
@Zagir-vip
Web dev, Game dev, app dev, Разработчик на Python!
В SQLAlchemy asyncIO, asyncsession.begin() и session.commit() представляют два разных этапа в асинхронном цикле работы сессии.

asyncsession.begin() используется для начала транзакции. Транзакция представляет собой блок операций, который будет выполнен атомарно – либо все операции успешно применятся, либо ни одна из них. Транзакция обеспечивает целостность данных и позволяет откатывать операции, если что-то идет не так.

session.commit() используется для фиксации (commit) изменений, сделанных во время транзакции. Это означает, что все изменения, выполненные в рамках транзакции, сохраняются в базе данных. Если транзакция завершилась успешно, то изменения становятся видимыми для других пользователей базы данных.

Таким образом, asyncsession.begin() начинает транзакцию, а session.commit() закрывает транзакцию и сохраняет изменения. Эти операции необходимо использовать совместно для правильной работы сессии.

Пример использования:
async with AsyncSession(engine) as session:
    async with session.begin():
        # выполнение операций внутри транзакции
        # изменение, добавление или удаление объектов
        # выполнение запросов

    # после окончания транзакции вызываем session.commit()
    await session.commit()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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