【问题标题】:Django db transaction set_autocommit and CONN_MAX_AGEDjango 数据库事务 set_autocommit 和 CONN_MAX_AGE
【发布时间】:2014-12-23 21:20:10
【问题描述】:

我想做一个原子事务,我的数据库是 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_MAX_AGE=60

以下情况会发生什么:

  1. 第一个请求将自动提交设置为False
  2. 第二个请求进行数据库更新
  3. 第一个请求引发和异常、回滚并将自动提交设置回True

我在 2. 中的更新会继续存在吗?

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

【问题讨论】:

    标签: python django postgresql transactions


    【解决方案1】:

    我会推荐使用transaction.atomic(),因为它的目的是做你想做的事。

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

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

    【讨论】:

    • 一个重要的区别是成功的内部原子块仍然可以被外部原子块回滚(例如,如果您将 ATOMIC_REQUESTS 设置为 True)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多