teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

トランザクション失敗時の挙動について追記

2017/07/30 13:36

投稿

miyahan
miyahan

スコア3095

answer CHANGED
@@ -4,4 +4,4 @@
4
4
 
5
5
  一般的には高速な**キャッシュサーバー**を別に立てて利用することが多いようです。Django の公式リファレンス: [Django のキャッシュフレームワーク — Django 1.4 documentation](http://docs.djangoproject.jp/en/latest/topics/cache.html#api) にあるように、Memcached をバックエンドとして 低水準のキャッシュAPI を使うのがよい落としどころだと思います。
6
6
 
7
- また基本的にキャッシュサーバーは競合を防ぐ仕組みを持ちません(だから速いんです)マスターデータは RDBMS (MySQL, PostgreSQL など)にあると思いますので RDBMS のロック機能を使わせてもらえばよいと思います。具体的にはキャッシュミス時のロード時書き換え時に排他ロックをかけてマスターデータの読み書きを行いつつ、その間にキャッシュサーバーのデータを更新するようにすれば競合が回避できます。
7
+ またキャッシュサーバーは基本的に更新の競合を防ぐ仕組みを持ちません(だから速いんです)マスターデータは RDBMS (MySQL, PostgreSQL など)にあると思いますので RDBMS のロック機能を使わせてもらえばよいと思います。具体的にはキャッシュミス時や更新時に排他ロックをかけてマスターデータの読み書きを行いつつ、その間にキャッシュサーバーのデータを更新するようにすれば競合が回避できます。ただ万が一トランザクションが失敗してロールバックが走ると、マスターデータは前のままでキャッシュは失敗したデータと不整合が起きます。更新がガシガシ走るようなパラメーターはそもそもキャッシュの効果は薄いですし、本当にキャッシュが必要なのか慎重に検討すべきだと思います。