2

我有webapp2服務,其中在不相互依賴的多個NDB模型中插入條目。 現在我們要求的是服務應該在交易中。這是服務的東西失敗,那麼就應該恢復完整的交易 (例如,如果插在第一&第二模型和交易後的項目失敗,那麼它應該刪除的記錄在第一個模型插入。)ndb事務支持在同一事務中更新/回滾多個ndb模型條目

我看着進入ndb交易,但看起來沒有用,因爲它一次只能用於一個模型。此外,我還研究了跨組交易,但這不是我的數據結構所必需的。

例如

模型結構

class ModelTestA(ndb.Model): 
    field1 = ndb.StringProperty() 
    field2 = ndb.StringProperty() 

class ModelTestB(ndb.Model): 
    field1 = ndb.StringProperty() 
    field2 = ndb.StringProperty() 

webapp2的服務

from google.appengine.ext import ndb   
from google.appengine.api import datastore_errors 
@ndb.transactional(xg=True) 
def put_entity(): 
    try: 
     testa_obj = ModelTestA() 
     testa_obj.field1 = "ModelAF1" 
     testa_obj.field2 = "ModelAF2" 
     dbsput(testa_obj) 
     0/1 # also tried this raise datastore_errors.TransactionFailedError('The transaction could not be committed. Please try again.') 
     testb_obj = ModelTestB() 
     testb_obj.field1 = "ModelBF1" 
     testb_obj.field2 = "ModelBF2" 
     dbsput(testb_obj) 
    except Exception as e: 
     logging.info(e) 

class TransactionTesting(webapp2.RequestHandler): 
    def get(self): 
     put_entity() 

任何想法?

+1

您是如何得出結論:交易僅限於一種模式? –

+0

基於文檔,它將是單一的模型。 https://cloud.google.com/appengine/docs/python/datastore/transactions –

+1

該文檔中沒有任何內容說明您僅限於單一模型。這些例子只使用一個模型,因此它們很清楚。 –

回答

1

交易是模型(類)不可知的,所以不限於單一模型。

只關心實體組。

  • 如果所有實體都在單個實體組中,則受「交易的最大尺寸」(當前爲10 MiB)限制。
  • 如果實體在多個實體組,有一個「可在交易進行訪問的實體組最大數量」額外的限制(目前爲25)

在NDB事務性符號需要你讓爲了回滾事務,除了函數外。在您的代碼中,try ... except子句吞噬異常,導致NDB認爲事務正常完成。