我有一个函数,在同一个数据集上执行多个查询,我想确保所有查询都能看到完全相同的数据。在Django中,如何实现交易的可重复读取?
在SQL而言,这意味着为支持它的数据库重复读隔离级别。如果数据库不可用,我不介意有更高的级别,甚至完全锁定。
据我看到的,这是情况并非如此。即如果我在一个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的一些兼容性在这种情况下甚至完全锁定整个数据库是跟我没关系。然而,显然,解决方案越一般,越优选。
缓存这个元数据是一种可接受的方法? –
不幸的是,没有。我所做的查询计算了原始事件数据的各种统计数据,并且具有一致的视图,我将不得不将整个数据集拉到内存中,这是我真正不想做的事情。 – drdaeman