【发布时间】:2015-09-06 11:24:06
【问题描述】:
我有一个函数,它对同一个数据集执行多个查询,我想确保所有查询都会看到完全相同的数据。
就 SQL 而言,这意味着支持它的数据库的 REPEATABLE READ 隔离级别。如果数据库没有能力,我不介意更高级别甚至完全锁定。
据我所知,情况并非如此。 IE。如果我在一个 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 有一些兼容性,在这种情况下,即使完全锁定整个数据库也可以。然而,显然,解决方案越通用,就越受欢迎。
【问题讨论】:
-
缓存此元数据是一种可接受的方法吗?
-
不幸的是,没有。我所做的查询计算原始事件数据的各种统计信息并获得一致的视图,我必须将整个数据集拉到内存中,这是我真的不想做的事情。
标签: python django transactions isolation-level transaction-isolation