GAE DB 注意事項

當我們在寫server side 程式
要注意如果當在一個程式碼片段中先執行了資料庫抓取動作
例如抓了一筆資料為A

而又在接下來的程式片段中呼叫了函式, 而該函式恰巧也會動到A, 並把運算結果存回A

接著當該函式做完, 又再執行了若干操作
接著將更動儲存回A

經由實驗, 發現此時會導致A 資料的race condition
亦即, 在函式中修改的東西, 又被覆蓋掉
只剩下最後若干操作的更動生效

個人猜測GAE 運作機制比較像是  先抓取了A
往後操作的是A 的副本, 對他進行完運算後
再將此副本儲回資料庫

所以, 此時函式進行的運算, 由於原函式片段還沒進行儲回的動作
所以抓取的A 是修改尚未儲存的A, 經過一番運算儲回A

最後一段程式碼儲回時, 由於抓取的資料是函式尚未執行前的資料
所以等於函式做的更動完全沒有在此副本中, 所以函式所做的修改就會被覆蓋

結論: 最好避免"巢狀的去存取資料"

留言

熱門文章