【问题标题】:How to tell if your select query is within a transaction or not?如何判断您的选择查询是否在事务中?
【发布时间】:2013-09-03 20:09:36
【问题描述】:

在 Django 1.5.x 中,我有一个长时间运行的管理命令,其中选择查询返回过时的数据。我怀疑这是因为它们在数据库连接上较早启动的事务中运行。有没有办法判断查询是在事务中运行还是处于自动提交模式?

(这是我在https://stackoverflow.com/questions/18540099/orm-does-not-return-recent-database-changes 发布的早期问题的更集中的版本)

【问题讨论】:

    标签: django django-orm


    【解决方案1】:

    从 Django 1.7 开始,Connection.in_atomic_block 会告诉你连接是否在事务中。似乎没有记录,但它可以在我的机器上运行:

    from django.db import transaction
    cxn = transaction.get_connection()
    if cxn.in_atomic_block:
        print "We're inside a transaction!"
    

    【讨论】:

    • 这是 Django 本身用于控制流程的测试,这是您在通过源代码github.com/django/django/blob/… 挖掘解决方案时会得到的最好的测试
    • 我认为除了transaction.atomic() 之外还有其他方法可以参与交易,这种方法会错过。
    【解决方案2】:

    从 Django 1.6 开始,您可以通过 transaction.get_autocommit API 判断您是否处于自动提交模式。

    from django.db import transaction
    
    if transaction.get_autocommit():
        pass  # We are in autocommit
    

    【讨论】:

      【解决方案3】:

      您可以通过检查is_managed来检查您是否在交易中

      if transaction.is_managed():
          print "tutsi frutsi!"
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 2012-11-20
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多