[Seasar-user:2606] Re: S2DAOによる行ロックについて

sato sato
2005年 9月 27日 (火) 09:55:22 JST


NSQ佐藤です

>J.r0ckです。
>
>土曜日からほとんど寝ておらずかなりハイになっているので
>間違いがあったらごめんなさい(汗)

忙しい所、返信頂きありがとうございます
土曜からほとんど寝てないってスゴイ状況ですね・・・。

>
>> NSQ@佐藤です。
>
>> (ちなみに、S2DAOを使用してSQLファイルを準備して、FOR UPDATEを記述した
>> SQLを発行した場合にはエラーとなってしまいます。Oracleの場合、「ORA-
>> 01002: フェッチ順序が無効です。」 )
>このエラーは、SELECT〜FOR UPDATEを実行した後、コミット、その後にその
>レコードセットに対して操作を行ったために発生しているエラーかと
>思われます。
>詳細なロジックはわからないのですが、S2を使う上でのトランザクションの
>制御など今一度見直してみてはいかがでしょうか?

AutoCommitがTrueの状態でFOR UPDATEを使用している事が原因でエラーが出てる
のだと思います。
S2DAOではコンテナに全てを任せてるのでAutoCommitをfalseにする事は出来ない
のでしょうが、それだとFOR UPDATEが使いたい場合にどのようにすれば良いのだ
ろうか?と思い質問しました。

そもそもS2DAOを使用した場合、FOR UPDATEは利用可能なのでしょうか?
>
>> UserTable
>> -----------------------------
>> ID
>> NAME
>> UPDATE_COUNT
>> -----------------------------
>> 
>> そこで「このテーブルに同一IDが存在しない場合はINSERT。同一IDが存在する場
>> 合にはUPDATE_COUNTに1を加算する。」といった処理が行いたい場合に、
>> UPDATE_COUNTが最大であるレコードをFOR UPDATEで行ロックをかけた後に
>> UPDATE_COUNTを加算してUPDATEを行うという方法が考えられます。
>また、このケースで行ロックをかけなければいけないこと自体にも?
>必要性のない行ロックをかけようとしているようにも思えます。
>
>もし、仮にIDが一意であるならば(主キーになっているならば)
>1.INSERTする。
>2.一意制約違反が発生したらUPDATEする。
>だけで、Oracleであれば暗黙のうちに排他がかかるはずですよ。
># UPDATE文は排他を司り、SELECT文は一貫性を司ります。
># この辺りの詳細は、Oracleのドキュメントを参照してください。

確かにそうですね。
今回の場合はそれで対応可能と思います。

しかし、別処理で以下のような処理があります。

UserTable
 -----------------------------
 ID            PK
 SEQ            PK
 NAME
 -----------------------------

「このテーブルに同一IDが存在しない場合はSEQを0としてINSERT。同一IDが
存在する場合には、同一IDで現在までに取得されているSEQの最大値+1をSEQと
してINSERTする」といった処理の場合は、更新中に他ユーザーが同じSEQの最大
値を取得してしまわないようにSEQの最大値レコードをSELECT〜FOR UPDATEして
ロックをしてから処理したいと思うのですが、この場合は上記方法では解決でき
そうにありません
このような場合にはコンテナを利用せずJDBCアクセスによる制御を行うべきなの
でしょうか?

>
>また、ここでUPDATE_COUNTの値をSELECT文を使ってロジックが
>抱えてしまう場合に排他をかけたいなと思うのでしょうが
>ロジックでは、UPDATE_COUNTの値を一切保持せず
>UPDATE SET UPDATE_COUNT = UPDATE_COUNT + 1 WHERE ID = xxxx
>とすれば解決できるかと...。

気が付きませんでした。。。
上記の問題もINSERT文の中でSEQの最大値レコードをSELECTして、得たSEQに1を
加算する事で対応可能な感じですね。


期待どおりの動作が可能か試してみます。
ありがとうございます。

>
>以上
>
>
>-- 
>J.r0ck <[E-MAIL ADDRESS DELETED]>
>
>_______________________________________________
>Seasar-user mailing list
>[E-MAIL ADDRESS DELETED]
>http://lists.sourceforge.jp/mailman/listinfo/seasar-user


=========================================================
株式会社 ネットスクエア
   佐藤 慎也 <E-mail:[E-MAIL ADDRESS DELETED]>
  
   〒733-0822
     広島市西区庚午中4丁目6−1セントラルビル3F
     http://www.net-squares.com/
     TEL:(082) 507 - 6266
     FAX:(082) 507 - 6267
 =======================================================
<< ISO文書管理は弊社のISO-SQUAREにお任せ下さい。       >> 
 =======================================================




Seasar-user メーリングリストの案内