状況
異なるcollection配下にある複数のdocumentに対してtransactionを実行したい
やり方
参考:
Cloud Firestore で複数の DocumentReference に対し Transaction を実行する - Qiita
同じトランザクションを使い回せば大丈夫なようです。
入れ子にした、違うトランザクションだとコミットされてしまったものはロールバックされないのでダメです。
正しい例:
const res = await firestore.runTransaction(async t => { t.create(refA, insertDataA); t.create(refB, insertDataB); throw 'error'; // 両方のデータがロールバックされる。 });
ダメな例:
入れ子にして違うトランザクションを実行してしまう。
const res = await firestore.runTransaction(async t1 => { t1.create(refA, insertDataA); const res = await firestore.runTransaction(async t2 => { t2.create(refB, insertDataB); )}; throw 'error'; // t2はコミットされてしまうが、t1はロールバックされる。 });