【问题标题】:Sharing transaction scope between threads in python/django? (PostgreSQL)在 python/django 中的线程之间共享事务范围? (PostgreSQL)
【发布时间】:2010-11-02 15:25:16
【问题描述】:

有没有办法在基于 django 的代码中的两个线程之间共享相同的事务?

问题是我有 1.1 的 TestCase(将单个测试包装到事务中的那些),旨在测试在不同线程中运行的代码 [一种异步测试]。因此,这些测试创建了一些打算供第二个线程使用的数据。显然,由于此数据是在事务范围内创建的,因此对第二个线程是不可见的。但既然这应该基本上是与 PgSQL 的相同连接(应该吗?)我希望有一种方法可以共享此事务范围,以便我的第二个线程可以访问其中添加的数据?..

有什么想法吗?

数据库是 PgSQL 8.3,驱动是 postgresql_psycopg2。 Django——主干。

【问题讨论】:

    标签: django postgresql transactions psycopg2 django-testing


    【解决方案1】:

    我会说这是不可能的。据我所知,每个线程都有自己的 PostgreSQL 会话,可以同时运行。鉴于 PostgreSQL 是一个 MVCC 数据库,一个线程将无法访问另一个线程的更改,直到事务被提交——在 Django 1.1 TestCase 的情况下不会。

    如果您需要测试同时运行的东西,我很确定您需要使用TransactionTestCase

    【讨论】:

    • TransactionTestCase 正在杀死我——出于某种原因,TRUNCATE 需要 forever 才能完成......
    • 你有没有检查过第二个线程在测试结束前是否已经停止了?这可能会导致截断运行得更慢,因为每个 MVCC,PostgreSQL 必须存储截断数据的副本。
    • hm,这很有趣.. 整个想法不是在所有测试生命周期内停止后台线程。在这种情况下,我可能会考虑分别在每个 setUp 和 tearDown 中启动和停止第二个线程。
    • 我认为您在使用 setUp 和 tearDown 时是正确的,但这在一定程度上取决于您的测试性质。通常,要使测试成为原子测试,两个线程必须在同一个数据集上工作,并且为每个测试启动一个新线程可能是确保这一点的最干净的方法。
    • 是的,我之前考虑过——只是有点担心在某些时候第二个线程启动可能不是即时的;)
    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2010-12-09
    • 2014-01-05
    • 1970-01-01
    相关资源
    最近更新 更多