トランザクション
スケール時のパフォーマンス向上のために、1 つまたは複数のドキュメントに対して複数の mutation をアトミックに実行します。
トランザクションは、一連の mutation を 1 つのアトミックな作業単位として実行する必要があるシナリオで有用です。たとえば、単一のトランザクションの一部として複数のドキュメントを更新し、すべてのドキュメント間でデータの整合性が保たれるようにしたい場合があります。
Squid でトランザクションを実行するには、squid オブジェクトが提供する runInTransaction メソッドを使用します。このメソッドは callback 関数をパラメータとして受け取り、この関数はトランザクションのコンテキスト内で実行されます。
Client code
await squid.runInTransaction(async (transactionId: string) => {
const user1 = squid.collection<User>('users').doc('user_1_id');
const user2 = squid.collection<User>('users').doc('user_2_id');
await user1.update({ name: 'Alice' }, transactionId);
await user2.update({ name: 'Bob' }, transactionId);
});
トランザクション内で変更を適用する場合、これらの変更はすぐには反映されませんが、callback 関数が完了すると楽観的(optimistically)に反映されます。
これは、トランザクションを使用せずに mutation を適用する場合と対照的です。この場合、変更は即座に楽観的に適用されます。トランザクションの一部として適用される mutation はすべて即座に resolve されます。サーバー上で変更が適用されたことを確認するために、runInTransaction から返される promise が resolve されるのを待つ必要があります。
Note
複数の connector に対してトランザクションを適用する場合、各 connector はアトミックに更新されます。ただし、一方の connector は更新に成功し、もう一方は失敗する可能性があります。connector をまたいだアトミック更新はサポートされていません。