我有一个函数,对同一数据集进行多个查询,我希望确保所有查询看到的数据完全相同。
就SQL而言,这意味着对支持它的数据库使用REPEATABLE READ隔离级别。如果数据库不支持,我不介意使用更高的级别甚至完全锁定。
据我所见,情况并非如此。也就是说,如果我在一个Python shell中运行以下代码:
只要我在另一个函数中执行
我还想强调一点,我只想为单个函数提供更严格的隔离级别,而不是整个项目。
我最好的选择是什么?
在我的特定情况下,我关心的唯一数据库是PostgreSQL 9.3+,但我也希望与SQLite3兼容,如果必要,甚至完全锁定整个数据库对我来说也可以。然而,显然,通用性更强的解决方案更受欢迎。
就SQL而言,这意味着对支持它的数据库使用REPEATABLE READ隔离级别。如果数据库不支持,我不介意使用更高的级别甚至完全锁定。
据我所见,情况并非如此。也就是说,如果我在一个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兼容,如果必要,甚至完全锁定整个数据库对我来说也可以。然而,显然,通用性更强的解决方案更受欢迎。