2017-03-16 2 views

答えて

1

はい、Cloud Datastoreは、同じトランザクションで複数の種類の書き込みをサポートしています。 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

素晴らしい感謝。更新の対象については、オプティミスティックロックを行うことができますが、この1つがコミットされる直前に開始されコミットされる直前に別のトランザクションによって書き込まれた可能性のあるフィールドを上書きしないことを確認できますか? – 1977

+0

Cloud Datastoreトランザクションはシリアル化可能です。したがって、トランザクションがデータを読み取るときに、トランザクションをコミットするときに変更されていないことを保証することができます。そうであれば、トランザクションは失敗し(トランザクションランナーは再試行する必要があります)。フィールドレベルではなくエンティティ(実際にはエンティティグループ)レベルにあることに注意してください。トランザクションがこれらのフィールドに接触していない場合でも、他のトランザクションの追加フィールドはトランザクションに失敗します。 –

関連する問題