2013-08-07 38 views
4

兩個代碼示例(簡化的):該事務AppEngine Transaction是否需要執行get和put操作才能使其有用?

@db.transactional 
def update_object2_txn(obj_key, new_value): 
    obj = db.get(obj_key) 
    obj.prop1 = new_value 
    return obj.put() 
內部


。獲得的事務之外(對象從。獲得傳遞到事務性功能)

@db.transactional 
def update_object_1_txn(obj, new_value): 
    obj.prop1 = new_value 
    return obj.put() 

。獲得


第一個例子合乎邏輯嗎?那裏的交易有用嗎?它提供了什麼?我試圖更好地瞭解appengine的交易。選擇第二個選項會阻止該對象的併發修改嗎?

回答

4

要用一個詞回答你的問題:是的,你的第二個例子是實現它的方法。在交易的邊界中,您可以獲取一些數據,更改它並提交新值。

你的第一個沒有錯,因爲你沒有閱讀obj。所以即使它的價值可能與之前得到的價值不同,你也不會注意到。換一種說法:正如所寫的,你的例子並不擅長說明交易的重點,通常稱之爲「測試和設定」。看到一個很好的維基百科的文章在這裏:http://en.wikipedia.org/wiki/Test-and-set

更具體到GAE,如GAE docs定義,交易是:

一組上的一個或多個實體的數據存儲操作。每筆交易都保證是原子的,這意味着交易不會部分應用。事務中的所有操作都應用,或者它們都不應用。

它告訴你它並不一定只是用於測試和設置,它也可能是確保批提交幾個實體有用的,等

+0

真棒,謝謝。很好的答案! – computmaxer

相關問題