我有一個函數,在同一個數據集上執行多個查詢,我想確保所有查詢都能看到完全相同的數據。在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