SQLAlchemy会话提交异常处理与回滚



我试图找出管理会话的首选方式,如果在做操作或提交会话时发生异常。但是文档中的几个例子让我有点困惑。

文档说要框定一个提交/回滚块,你可以这样做:

# verbose version of what a context manager will do
with Session(engine) as session:
session.begin()
try:
session.add(some_object)
session.add(some_other_object)
except:
session.rollback()
raise
else:
session.commit()

虽然这个例子包括try块中的commit()调用:

Session = sessionmaker(bind=engine)
session = Session()
session.begin()
try:
item1 = session.query(Item).get(1)
item2 = session.query(Item).get(2)
item1.foo = 'bar'
item2.bar = 'foo'
session.commit()
except:
session.rollback()
raise

我想知道:

  1. 这两种模式有什么区别?
  2. 管理事务的首选方式是什么?
  3. 文件说上面两个例子都可以用session.begin()上下文管理器简洁地说明,所以它是否处理commit()时发生的异常?

可能的相关答案:

这是一个将commit()排除在try块之外的答案,但评论中的解释对我来说似乎不够。这回答提到关于为什么包括commit()try块。

这两个例子完成了几乎相同的事情。如果没有错误,事务将被提交;如果有错误,事务将被回滚。

不同之处在于,如果提交本身上有异常,第二个示例将回滚。在提交时得到异常是不常见的,但这是可能的。

相关内容

  • 没有找到相关文章

最新更新