2016-01-23 82 views
1

dataset.runInTransactionlink)的示例中,在transaction.get(key,callback)上發生了明確的錯誤處理。保存或刪除時,數據存儲事務是否需要回滾?

但是在其他操作上,如transaction.save(entity)transaction.delete(key),沒有回調,所以真的沒辦法處理錯誤。例如:

dataset.runInTransaction(function(transaction, done) { 
    transaction.save({ 
     key: dataset.key(['Company', 123]), 
     data: {} 
    }); 
    transaction.delete(dataset.key(['Company', 456])); 
    done(); 
}, function(err, apiResponse) {}); 

這是否意味着不需要顯式回滾事務?

+0

雖然我也懷疑在錯誤事務中是否需要調用.rollback(),但您錯誤地關於.save()沒有回調。請參閱https://googlecloudplatform.github.io/gcloud-node/#/docs/v0.27.0/datastore/transaction?method=save – JasonS

+0

我相信transaction.save不會,但dataset.save會將回調作爲最後一個參數。 –

+0

你是對的,我對他們的文檔提出了問題,他們正在修復它。 – JasonS

回答

0

我花了很多回往復的與問題跟蹤器的gcloud-node貢獻者:

  1. https://github.com/GoogleCloudPlatform/gcloud-node/issues/1120
  2. https://github.com/GoogleCloudPlatform/gcloud-node/issues/633

基本上所有的編輯的在同一時間完成(一旦調用done()),如果有任何失敗,enti當時重新交易將被中止。

令人困惑的是有些操作如transaction.get()確實有回調。基本上,由transaction.get()返回的實體版本需要與.save().delete()發生之前的版本匹配(如果版本不匹配,再次發生時,發生done()),該事務會自動中止。

使用transaction.rollback()仍然有幫助,如果.get()調用中的某些內容與您的代碼所需的內容不匹配。