2013-07-04 87 views
9

在Google App Engine中,事務隔離被稱爲SNAPSHOT隔離,其中您沒有看到先前的刪除或放入事務本身,但僅在事務開始時才存在數據存儲區的狀態(https://developers.google.com/appengine/docs/python/datastore/transactions )。在一篇較早的文章中,它表示事務級別實際上是SERIALIZABLE(https://developers.google.com/appengine/articles/transaction_isolation)。谷歌應用程序引擎中的事務隔離

谷歌測試兼容性工具包(TCK)顯示它確實是SNAPSHOT隔離,但在上述文章中它說「內部事務,另一方面,隔離級別默認爲SNAPSHOT,可選擇更改爲SERIALIZABLE」。

我的問題是,如何使隔離級別變爲SERIALIZABLE?

+1

好問題,甚至沒有記錄 –

+0

GAE文檔中沒有記錄什麼東西?令人震驚的。至少如果GAE團隊成員回答這個問題,那麼有人可以通過Google搜索找到它。 –

+0

@RomanLevin我根本沒有發現它令人震驚... btw從接受的答案中的數據存儲區API參考鏈接停止工作(不令人震驚) – themihai

回答

3

您可以看到如何更改BeginTransaction API Reference中的隔離級別。目前它只能在Google Cloud Datastore HTTP API中配置,並且默認爲所有App Engine SDK的SERIALIZABLE。不過,我認爲這不會做你想做的事情。

SNAPSHOT vs SERIALIZABLE控制事務隔離或併發事務如何相互交互。它並不控制事務與自身的交互方式(儘管在某些系統中這兩個事物是混合的)。

在數據存儲區中,設置SERIALIZABLE不會使其成爲事務將看到自己未提交的突變。這隻意味着如果併發事務在串行化時讀寫模式無效,它們將發生衝突。例如,下面的兩筆交易將使用SERIALIZABLE隔離時一定碰撞:

TX1: READ A, WRITE B' 
TX2: READ B, WRITE A' 

既不這兩種排序中是可能的:

READ A, WRITE B', READ B (conflict), WRITE A' 
READ B, WRITE A', READ A (conflict), WRITE B' 

然而,這些交易並不一定會使用快照隔離時發生碰撞。

SNAPSHOT和SERIALIZABLE均從數據的「快照」中讀取,就好像數據在事務運行時與事務隔離保證衝突的方式發生更改,事務不能提交。