firebase-admin-pythonでのトランザクションによるFirestoreの更新

3269 ワード

コレクションからドキュメントを更新順に取り出したいが並列実行しても重複しないようにしたい。というシナリオとする

要点

  1. @firestore.transactional デコレータで包んだ範囲がトランザクション境界になる
  2. 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