0
Google Datastoreのノードapiを使用して、複数の種類の複数のデータストアエンティティを1つのトランザクションに保存することはできますか?複数の種類の複数のデータストアエンティティを1つのトランザクションに保存できますか?
Google Datastoreのノードapiを使用して、複数の種類の複数のデータストアエンティティを1つのトランザクションに保存することはできますか?複数の種類の複数のデータストアエンティティを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());
}
素晴らしい感謝。更新の対象については、オプティミスティックロックを行うことができますが、この1つがコミットされる直前に開始されコミットされる直前に別のトランザクションによって書き込まれた可能性のあるフィールドを上書きしないことを確認できますか? – 1977
Cloud Datastoreトランザクションはシリアル化可能です。したがって、トランザクションがデータを読み取るときに、トランザクションをコミットするときに変更されていないことを保証することができます。そうであれば、トランザクションは失敗し(トランザクションランナーは再試行する必要があります)。フィールドレベルではなくエンティティ(実際にはエンティティグループ)レベルにあることに注意してください。トランザクションがこれらのフィールドに接触していない場合でも、他のトランザクションの追加フィールドはトランザクションに失敗します。 –