Python Django db事务集自动提交和连接最大年龄

Python Django db事务集自动提交和连接最大年龄,python,django,postgresql,transactions,Python,Django,Postgresql,Transactions,我想做一个原子事务,我的数据库是PostgreSQL 到目前为止,我是如何进行交易的: transaction.set_autocommit(False) try: do_stuff() transaction.commit() except: transaction.rollback() raise finally: transaction.set_autocommit(True) 医生说我可以这样做: with transaction.atomic(

我想做一个原子事务,我的数据库是PostgreSQL

到目前为止,我是如何进行交易的:

transaction.set_autocommit(False)
try:
    do_stuff()
    transaction.commit()
except:
    transaction.rollback()
    raise
finally:
    transaction.set_autocommit(True)
医生说我可以这样做:

with transaction.atomic():
    do_stuff()
这两个代码是一样的吗

在我的
settings.py
中有一个连接池
CONN\u MAX\u AGE=60

以下场景会发生什么情况:

  • 第一个请求将自动提交设置为
    False
  • 第二个请求进行数据库更新
  • 第一个请求引发异常、回滚并将自动提交设置回
    True
  • 我的更新将在2。生存


    它与
    transaction.atomic()
    有什么不同吗?

    我建议使用
    transaction.atomic()
    ,因为它的目的正是做你想做的事情

    您可以看到实现。最明显的区别是Django的版本支持使用保存点的“嵌套”事务。您可以相信,这段代码经过了良好的测试并得到了广泛的使用


    对于您的场景,步骤2中的更新在任何一种情况下都应该有效,因为自动提交应用于数据库连接级别,并且两个并发请求将使用不同的数据库连接。

    一个重要的区别是,成功的内部原子块仍然可以由外部原子块回滚(例如,如果您已将原子_请求设置为True)。