一言で「排他処理」と言っても、Javaで実装したWebシステムで「排他」というキーワードに関連する処理を考えただけでもこれだけある。初学者はこれらがごっちゃになることも多いんじゃないかと思うのだけれど、こういう切り口でノウハウをまとめた書籍とかってないんだろうか?
DBMSの話
- トランザクション分離レベル
- 行ロック
- テーブルロック
- 行ロックやテーブルロック以外のロック
- 製品ごとにロックのかかる単位が異なる。SQL Serverはロックエスカレーションがあるし、行単位以外にもページ単位でロックがかかったりする*1。
- MySQLl*2やPostgreSQL*3にはアドバイザリロックの仕組みがある。
アプリケーション実装方法の話
- DBレコードの楽観排他・悲観排他の選択
- 楽観排他・悲観排他それぞれの実装方法の検討も含む。
- 業務処理の設計時に考慮する業務閉塞処理やバッチウィンドウの分離
- 夜間バッチのバッチウィンドウ設計の際に、同じリソースを使うバッチを同時に走らせない設計をする場合などがこれ。
アプリケーションフレームワークの話
- DBレコードの楽観排他
- 楽観排他処理の実装にJPAの
@javax.persistence.Version
を使う場合など。
- 楽観排他処理の実装にJPAの
- リソース分離
Servlet
クラスのフィールドやServletContext
を使わない、Spring Frameworkのコンポーネントに@Scope("request")
を指定するなど。
言語処理系の話
- 処理系組込みの同期化機構
- Javaだと
synchronized
。
- Javaだと
- プロセス内の並行処理用のライブラリ
- Javaだと
java.util.concurrent.ConcurrentHashMap
など。
- Javaだと
- 言語処理系のライブラリにおける同期化有無
- Javaだと
HashMap
とVector
の違いなど。
- Javaだと
- 言語処理系がライブラリとして提供するプロセス内同期化機構
- Javaだと
java.util.concurrent.Semaphore
など。
- Javaだと
- 共有リソースの分離
- 複数プロセスから参照可能なリソースの分離。一時ファイル名を一意にする際に
Files.createTempFile()
を使用するなど。
- 複数プロセスから参照可能なリソースの分離。一時ファイル名を一意にする際に
ミドルウェアの話
- リクエスト窓口制御による直列化
- Tomcatで
MaxThreads
を1にするなど。
- Tomcatで
- トランザクションごとのリソース分離
- OLTPモニタにおけるSYSOUTデータセットの書き込み先ファイルの分離など。
- アプリケーションサーバによるセッション分離
HttpSession
によるセッション単位の分離、ThreadLocal
によるスレッド単位の分離など。