📌
firebase-admin-pythonでのトランザクションによるFirestoreの更新
コレクションからドキュメントを更新順に取り出したいが並列実行しても重複しないようにしたい。というシナリオとする
要点
-
@firestore.transactional
デコレータで包んだ範囲がトランザクション境界になる -
firestore.client().transaction()
オブジェクトにget/setを指示する
サンプル
from firebase_admin import firestore
def dequeue(size):
db = firestore.client()
@firestore.transactional
def get_and_update(transaction):
docs = db.collection('queue').order_by('updated_at').limit(size).get(transaction=transaction)
ids = []
for doc in docs:
transaction.update(doc.reference, {'updated_at': firestore.SERVER_TIMESTAMP})
ids.append(doc.id)
return ids
ids = get_and_update(db.transaction())
return ids
Discussion