前提
非同期の Web API を作成しています。同ユーザーが短期間に連続でアクセスした際、並行処理が行われ、データに不整合が発生します。
例えば以下のようなテーブルがあった場合、
id | user_id | number |
---|---|---|
0 | A | 0 |
1 | A | 1 |
2 | A | 2 |
3 | B | 0 |
4 | B | 1 |
ユーザーAが新規レコードの追加をほぼ同時にリクエストしたとします。
- req1: レコード数のクエリ(count -> 3)
- req2: レコード数のクエリ(count -> 3)
- req1: レコード追加(number=3)
- req2: レコード追加(number=3)
このように並行処理され、結果は以下のようになります。
id | user_id | number |
---|---|---|
0 | A | 0 |
1 | A | 1 |
2 | A | 2 |
3 | B | 0 |
4 | B | 1 |
5 | A | 3 |
6 | A | 3 |
質問
楽観的ロックを行えば解決すると思いますが、ネットの情報ではほぼ全て複数ユーザーによるリソースアクセスへの話であって、同じユーザーによる同時アクセスに対して楽観的ロックを行って良いものかと悩んでいます。
また楽観的ロックを行うとしても、同じユーザーによる連続リクエストは全てのエンドポイントにおいても気を付けなければならないため、対応として場当たり的だと感じてしまいます。(おそらく「データを読み込み、そのデータを処理して、書き込む」ような処理すべてに気を使わなければなりません。)
どのように解決するのが妥当なのでしょうか?
補足情報
Python のフレームワーク FastAPI で開発しています。データベースは PostgreSQL, ドライバは asyncpg, ORMは SQLAlchemy です。
Python: 3.9
FastAPI: 0.71.0
asyncpg: 0.25.0
SQLAlchemy: 1.4.29
回答1件
あなたの回答
tips
プレビュー