DBセッションロックをconnection poolで使うなら取得から解放まで同一物理接続を占有する
MySQL
信頼性
並行制御
接続プール
判断
運用
DBのセッション単位ロックはトランザクションではなく物理接続に所属する。connection pool経由で取得と解放を別々の通常クエリとして流すと、別接続で解放を試みる可能性がある。元の接続がロックを保持したままpoolへ戻ると、その資源に対する後続操作が長時間timeoutし続ける。
セッションロックを採用する場合は、取得前にpoolから物理接続を借り、保護対象処理の完了まで占有し、同じ接続からfinallyで解放してからpoolへ返す。取得timeoutや戻り値の異常は処理開始前の失敗として扱う。解放を実行できない、または解放成功を確認できない場合は、その接続をpoolへ返さず破棄し、切断によるサーバー側のロック解放へ倒す。
外部I/O中もロックを保持するなら、DB接続も同じ時間だけ占有する。外部client timeoutをロック保持時間とpool占有時間の上限として設計し、同時実行数に対してpool容量が足りるかを確認する。
検証では、取得・解放に使った物理接続の同一性、正常時と例外時の解放、解放不能時に接続がpoolへ戻らないことを固定する。別接続から同じロック名を取得できるところまで確認すると、見かけ上finallyが通っただけの空通しを防げる。