2017-03-16 24 views

回答

1

是的,雲數據存儲確實支持在同一事務中寫入多種類型。舉一個example from the getting started guide,你可以更新Task實體,寫一個新的,在這種情況下,將用戶登錄事件:

function markDone (taskId) { 
    const transaction = datastore.transaction(); 
    const taskKey = datastore.key([ 
    'Task', 
    taskId 
    ]); 

    return transaction.run() 
    .then(() => transaction.get(taskKey)) 
    .then((results) => { 
     const task = results[0]; 
     task.done = true; 
     transaction.save({ 
     key: taskKey, 
     data: task 
     }, 
     // Also write a log of the user action. 
     { 
     key: datastore.key(['User', current_user, 'Event']), 
     data: [{ 
      name: 'event', 
      value: 'TaskDone' 
      }] 
     }]); 
     return transaction.commit(); 
    }) 
    .then(() => { 
     // The transaction completed successfully. 
     console.log(`Task ${taskId} updated successfully.`); 
    }) 
    .catch(() => transaction.rollback()); 
} 
+0

真棒感謝。雖然在更新的問題上有無論如何都要做樂觀鎖定,這樣人們可以肯定不會覆蓋可能在另一個事務中寫入的任何字段,這些字段在這個事件剛剛啓動之前就已經啓動並且提交了。 – 1977

+0

雲端數據存儲事務是可序列化的。因此,當您的交易讀取數據時,您可以保證在您提交交易時沒有改變。如果事務失敗(事務運行者應該重試)。請注意,這是在實體(實際上是實體組)級別,而不是字段級別,所以來自其他交易的其他字段仍然會使交易失敗,即使您的交易未觸及這些字段。 –

相關問題