关于 SQLAlchemy 的一个问题

2017-11-08 18:44:43 +08:00
 RuiQ

try: a_session.commit() b_sessiom.commit() except Exception: a_session.rollback() b_session.rollback()

在处理两个 db 的时候,如果执行 a_session.commit() 就报错了,因为 b_session.commit()没有执行,那么 b_session.rollback() 会报错 或者会有什么不好的影响吗。

本意就是 a 或 b 其中一个执行错了 都回滚的。

求教大佬们。。。

1675 次点击
所在节点    Python
8 条回复
Wichna
2017-11-08 19:01:34 +08:00
session.rollback() 的执行应该是具有幂等性的吧,没有任何 commit 执行 rollback 应该不会有什么问题
fox0001
2017-11-08 19:01:48 +08:00
事务没学好…
RuiQ
2017-11-08 19:05:30 +08:00
@fox0001 唉 补课去了。。
ryd994
2017-11-08 20:47:04 +08:00
我觉得你这里设计就错了。看你的意思,a 和 b 要求同时成功或失败,那他们就应该合并为一个事务啊。
siteshen
2017-11-09 00:07:53 +08:00
@ryd994 我觉得题主的意思是,a_session 和 b_session 访问的是不同的数据库,没法在一个 transaction 处理。
RuiQ
2017-11-09 11:15:13 +08:00
@siteshen
@ryd994
是的 不是同一个数据库
ryd994
2017-11-09 13:07:13 +08:00
等等,你 commit 过的怎么还能 rollback ?
siteshen
2017-11-09 18:02:00 +08:00
这个能解决你的问题,可以去研究下。
http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html#enabling-two-phase-commit

For backends which support two-phase operation (currently MySQL and PostgreSQL), the session can be instructed to use two-phase commit semantics. This will coordinate the committing of transactions across databases so that the transaction is either committed or rolled back in all databases.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/404701

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX