Django db事务set_autocommit和CONN_MAX_AGE

时间:2014-12-23 21:20:11

标签: python django postgresql transactions

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

到目前为止,我一直在进行交易:

transaction.set_autocommit(False)
try:
    do_stuff()
    transaction.commit()
except:
    transaction.rollback()
    raise
finally:
    transaction.set_autocommit(True)

Doc说我可以这样做:

with transaction.atomic():
    do_stuff()

两个代码是否相同?

我的CONN_MAX_AGE=60中有一个连接池settings.py

以下情况会发生什么:

  1. 第一个请求将自动提交设置为False
  2. 第二个请求进行数据库更新
  3. 首先请求引发和异常,回滚,并将自动提交设置回True
  4. 我的更新是否会存活下来?

    transaction.atomic()会有所不同吗?

1 个答案:

答案 0 :(得分:1)

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

您可以看到实施here。最明显的区别是Django的版本支持使用保存点的“嵌套”事务。您可以相信此代码经过了充分测试和广泛使用。

关于您的方案,步骤2中的更新应该在两种情况下都存在,因为自动提交适用于数据库连接级别,并且两个并发请求将使用不同的数据库连接。