我对flask-sqlalchemy中的交易有疑问。
def funca():
instance = MyModel.query.get(5)
try:
instance.some_field = 'test'
instance.do_something()
instance.do_something_other() # Let's pretend that this causes exception
db.session.commit()
except Exception:
db.session.rollback()
# My model method
def do_something(self):
external_id = self.make_request_to_external_service()
self.external_id = external_id
# My model method
def do_something_other(self):
external_details = self.make_another_external_request()
self.external_details = external_details
我现在如何实现,在Exception上,这只会回滚some_field
和external_details
更改而external_id
仍保存在db中?
我可以使用嵌套事务,还是可以为这3个操作手动启动独立事务?
这里的问题是do_something
将获得external_id
并且必须保存在db中,因为我不能第二次执行此操作,如果我不回滚此事务{{1}将导致我的数据库和外部服务之间的不同步。
对于这个例子的目的,我们假装在some_field
之前不能do_something
,因为我可以运行它并独立提交,但我不能在我的真实应用程序中这样做。