[pgcluster: 231] Re: デッドロックもしくはそれに類似した症状について

Wataru Oguro oguro @ zenrin-datacom.net
2004年 3月 31日 (水) 18:27:52 JST


oguroです。お世話になります。

>>この時、ユーザ1とユーザ2が同時にログインしようとした場合、自分の所属す
>>るグループ名をkeyに現在の接続数を取得しますが、ユーザ1とユーザ2が同時
>>に現在の接続数を取得すると、両ユーザともログインできる事になってしまいます。
>>そこで、selectもロックするようにlock tableを発行して、その時点でのテーブ
>>ルのデータを元にチェックを行い、接続数を変更してトランザクションを終了し
>>ます。
>>
>>上記のようなケースですと、ロックモードを下げることができないので、トラン
>>ザクション設計で逃げることができないと思っています。
>>    
>>
>
>この条件でロックが干渉するのはデフォルトのaccess exclusive modeのみなん
>じゃないかと思います。lock ... in exclusive mode + さっきのパッチで問題
>がない事を確認しています。
>
># となると結局全部監視しないと駄目という事かなぁ。
>  
>
たしかに、lockの干渉は回避できると思いますが、システム要件を満たせていな
いような気がします。
exclusiveモードではselectを許すわけですから、現在テーブルにあるデータを
元に判断ができないことになりませんか?

[pgcluster: 229]で書いた例でお話させていただくと、ユーザ1とユーザ2が同
時にログインしようとした場合、
タイミングによってはどちらのセッションも「接続数0」という結果を得るので
はないのでしょうか?
これでは同時接続1という制限を無視して、2ユーザが同時にログインできてしま
いますよね。

そこで、どちらかが先に接続数管理テーブルをaccess exclusiveモードでロック
し、接続数が変更された後に、ロック待ちしているセッションが接続数管理テー
ブルから現在の接続数を取得するようにして、システム要件を満たしているわけ
です。

簡単に言うと、「同一テーブルの同一レコードを同時に検索されては困る」と
いったところでしょうか。
こう書くと、「どんなシステムだ」といった感じですが。。。。

#例でお話したようなシステム設計が特異なものなのでしょうか。。。。




pgcluster メーリングリストの案内