我想使用SQLAlchemy(在postgres中)使用嵌套事务,但是我想编写一个独立的函数,它不关心会话是否已经有事务 - 它可以启动嵌套事务或者适当的外部交易。
开始事务的最优雅语法是什么?适当的是外部事务还是嵌套事务?
到目前为止,我见过的最好的是:
session.begin(nested=session.is_active)
有没有比这更好的东西?
我正在使用postgres,它本身不支持嵌套事务,因此使用SAVEPOINT命令实现嵌套事务。
具体来说,上面代码的作用(至少对postgres来说)是: *如果没有正在进行的事务,则启动(非嵌套)事务(BEGIN) *如果正在进行的事务,则开始嵌套事务(SAVEPOINT)
有没有比这更好的东西?理想情况下,我只想调用session.begin()
并让它在内部解决,如果它需要是外部事务(BEGIN)或嵌套事务(SAVEPOINT),而我不必明确它。
我想编写一个函数f(session)
,它接受SQLAlchemy会话并在事务中进行一些更改。此外,我希望能够回滚f()
所做的更改(以及仅 f()
所做的更改)。
如果调用代码已经开始事务并进行了更改,那么我不希望在f()
内回滚来放弃调用代码所做的更改。