如何在sqlalchemy中启动事务而不考虑它是否嵌套?

时间:2016-02-19 13:04:59

标签: sqlalchemy

上下文

我想使用SQLAlchemy(在postgres中)使用嵌套事务,但是我想编写一个独立的函数,它不关心会话是否已经有事务 - 它可以启动嵌套事务或者适当的外部交易。

问题

开始事务的最优雅语法是什么?适当的是外部事务还是嵌套事务?

到目前为止,我见过的最好的是: session.begin(nested=session.is_active)

有没有比这更好的东西?

讨论

我正在使用postgres,它本身不支持嵌套事务,因此使用SAVEPOINT命令实现嵌套事务。

具体来说,上面代码的作用(至少对postgres来说)是: *如果没有正在进行的事务,则启动(非嵌套)事务(BEGIN) *如果正在进行的事务,则开始嵌套事务(SAVEPOINT)

有没有比这更好的东西?理想情况下,我只想调用session.begin()并让它在内部解决,如果它需要是外部事务(BEGIN)或嵌套事务(SAVEPOINT),而我不必明确它。

动机

我想编写一个函数f(session),它接受​​SQLAlchemy会话并在事务中进行一些更改。此外,我希望能够回滚f()所做的更改(以及 f()所做的更改)。

如果调用代码已经开始事务并进行了更改,那么我不希望在f()内回滚来放弃调用代码所做的更改。

0 个答案:

没有答案