在Django中,如何实现事务的可重复读取?

2024-05-20 14:09:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,在同一个数据集上执行多个查询,我想确保所有查询都能看到完全相同的数据。

就SQL而言,这意味着支持它的数据库的可重复读取隔离级别。如果数据库不起作用,我不介意有更高的级别,甚至完全关闭。

据我所见,情况并非如此。一、 e.如果我在一个Python shell中运行类似的代码:

with transaction.atomic():
    for t in range(0, 60):
        print("{0}: {1}".format(t, MyModel.objects.count()))
        time.sleep(1)

当我在另一个循环中执行MyModel.objects.create(...)时,运行循环看到的值立即增加。这正是我想要避免的。进一步的测试显示,该行为与READ COMMITTED级别匹配,这对我的口味来说太宽松了。

我还想强调一点,我想要更严格的隔离级别只针对单一功能,而不是整个项目。

我最好的选择是什么?

在我的特殊情况下,我唯一关心的数据库是PostgreSQL 9.3+,但我也希望与SQLite3兼容,在这种情况下,即使完全锁定整个数据库也可以。然而,显然,解决方案越笼统,就越可取。


Tags: 数据函数代码数据库forsqlobjectswith