Sastruts+S2JDBCで画面排他制御を実現する方法

このQ&Aのポイント
  • Sastruts+S2JDBCで画面排他制御を実現するための方法を検討しています。契約更新画面では、契約入力画面→契約確認画面→契約完了画面の順序で処理を行っています。契約入力画面までの段階で排他制御をかけ、先に画面にアクセスしたクライアントのみ処理を許可し、後からアクセスした場合は排他制御エラーとしたいです。
  • ForUpdateでのレコードのロックや、Entityに対して@Versionアノテーションを使用するなど、さまざまな試行錯誤をしてみましたが、解決策が見つかりませんでした。Sastruts+S2JDBC環境でこれを実現する方法はあるのでしょうか?
  • ご教授いただければ幸いです。
回答を見る
  • ベストアンサー

Sastruts+S2JDBC画面排他制御について

現在Sastruts+S2JDBCという環境でhttp://www.fastpic.jp/images/594/9469056688.jpgのような処理を実現したいと考えています。 契約更新画面の構成は契約入力画面→契約確認画面→契約完了画面となっており、 契約入力画面の時点で排他制御をかけ、先に契約入力画面にアクセスしたクライアントのみ以後の処理を可能とし、後に入力画面にアクセスしたクライアントは排他制御エラーとしたいです。 ForUpdateでのレコードのロックや、Entityに対して@Versionなどを用いて色々と試行錯誤してみたのですが解決策が見つかりませんでした。 このような標準のSastruts+S2JDBC環境で可能でしょうか? ご教授お願いします。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#147388
noname#147388
回答No.1

1アクションごとにコミットは実行されるため正攻法ではなく搦め手で ケース1 ロック用のスレッドを用いる。(内部で for update 文) ※このケースの場合、わずかなタイミングが存在するため @Version との兼ね合いが必要。 ケース2 別途ロックテーブルを利用する。 ※一定期間ない場合はロックタイムアウトとする必要あり。 純国産フレームワーク Seasar Framework をもちいてるのに本家で質問しないのはわけわかめ。 ml.seasar.org に質問したほうが有効な回答を得られますよ。 上記2つ以外の方法が得られる可能性もあります。 ちなみに @Version は 先更新勝です。 http://www.google.co.jp/search?gcx=c&sourceid=chrome&ie=UTF-8&q=site%3Aml.seasar.org#sclient=psy-ab&hl=ja&source=hp&q=s2jdbc+site:ml.seasar.org&pbx=1&oq=s2jdbc+site:ml.seasar.org&aq=f&aqi=&aql=&gs_sm=e&gs_upl=6354l10051l0l12097l11l11l1l0l0l1l266l1676l1.7.2l11l0&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=1ca09932ba2e0343&biw=1144&bih=689

mihune
質問者

お礼

ご回答ありがとうございます。 なるほど、正攻法ではできない可能性が高いわけですね。 ご教授頂いたケースでの実現方法を模索してみます。 [ml.sesar.orgについて] 程度の低い会話ではないのかと思い、本家での質問を躊躇しておりました。 本家の方でも質問をしてみようと思います。 ありがとうございました。

関連するQ&A

  • JDBCでのトランザクション・排他制御

    初めまして。 まだ初心者の身なのですが質問させてもらいます。 サーブレット・jspでJDBCを使いデータベースとの処理を行って簡単なショッピングサイトのようなものを作っています。 まずsetAutocomit() = falseでトランザクションを開始し データベースのUPDATEを行って、最後に確定する場合comit キャンセルする場合rollbackとしています。 しかし1人のユーザーがトランザクションを行っている場合に他のユーザーからアクセスされた場合にデータベースのトランザクション中の値を取ってきたいのですが、どうしてもトランザクションでUPDATEされる前の値になってしまうのです。 これを防止するのが排他制御というものだというのは分かったのですが 実際のやり方については、結構調べたのですがあまり載っていませんでした。 データベースはMySQLを使っています。 よろしければJDBCでの排他制御についてのアドバイス、もしくは詳しく説明されているサイトなどございましたら是非教えてください。 よろしくお願いします。

  • 関数内の排他制御について

    いつも的確な回答に助けられていますm( __ __ )m 以下のようなメソッドがあるとします。 function test() { 処理1: データベースから値を取得 処理2: 処理1 で取得した値に +1 する 処理3: 処理2 の結果をデータベースに書き込む } 【質問】 関数 test がクライアント A と B の2人からほぼ同時にアクセスされた時、以下のような事が起きてしまうと思います。 ・ A が 処理1 を実行 ・ A が 処理2 を実行 ・ B が 処理1 を実行 ・ A が 処理3 を実行 ・ B が 処理2 を実行 ・ B が 処理3 を実行 当然データベースにある値は期待通りの値ではないと思います。 期待する動きとしては、A が関数 test の全ての処理を抜けるまで B は入り口で待機させるというようなことを想像しているのですが、 こういった場合、どのように排他制御したら良いのでしょうか? 私は C# で排他制御を実装した経験があるのですが、 C# では同期オブジェクトを用意して lock を使ったり、 ManualResetEvent などを用いることで排他制御が可能でした。 PHP でそれらに匹敵するようなものは存在するのでしょうか?

    • 締切済み
    • PHP
  • 「トランザクション処理」と「排他制御」は同じ意味?

    アクセスなのですが「トランザクション処理」と「排他制御」は同じ意味ですか?

  • トリガに排他制御をかけたいのですが

    トリガに排他制御をかけたいのですが Oracleのトリガで、 トリガ内の処理に対して排他制御をおこないたいのですが、 どのように設定すればよいのでしょうか? トリガの内容は以下となります。 CREATE OR REPLACE TRIGGER TRI_TEST after update of (トリガの実行条件その1) on ORG_TBL FOR EACH ROW begin if (トリガの実行条件その2) THEN begin insert(実行される処理その1) EXCEPTION update(実行される処理その2) end; end if; end; / 上記の条件において、 「実行される処理その1」 「実行される処理その2」 を行っている最中に他からのアクセスをブロックをさせたく思っております。 本件の理由は 他からのアクセスで行われる処理が 「select(トリガによってデータが投入されてるテーブル)」 「truncate(トリガによってデータが投入されてるテーブル)」 を連続して行う処理のため、 排他を実行しなかった場合、 他からのアクセスの「select」と「truncate」の処理間に トリガによってレコードがinsertされた際に、 そのレコードがselectされなくなることを危惧しているためです。

  • 排他制御に関して

    こんばんは。お世話になっております。 これまで、質問のタイトルにある「排他制御」というものが「同時アクセスでの不具合を避けるための・・」といった程度の知識しかないまま、DB(MySQL)を利用して会員制のサイトを作っているのですが、全体を見直すべく、いざこの排他制御というものを取り入れようとしてみたところ、手持ちの書籍やこれまで見たサイトでは、ファイルをロック・・・などと言った感じで、DBとの関わりがイメージ出来ず、会員の登録情報の変更ページなどの入力フォームをはじめ、ログインページやDBを用いた検索ページにおいての活用は、どのような手順になるのでしょうか? 些か抽象的な質問になっておりますが、取り掛かりがつかめず、例えばログインページを例にとり、IDとパスワードを入力・DBに問合せ、といった流れでは、どのような手順になるかの全体像だけでもアドバイスいただければと、投函させて頂きました。 お忙しい中恐縮ですが、アドバイスなど頂戴できれば幸いです。宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 排他制御について

    質問します。 VB.NETとSQLServer2000を使用して受発注処理を作成したいのですが、排他制御について今悩んでいます。 レコードロックの動作についてなのですが、Aさんが「A01」のデータをレコードロックでデータを画面に表示している場合に、Bさんも(別PCにて)同様にレコードロックで「A01」のデータを表示することは可能なのでしょうか?(取得できるのか) 何方かご教授お願い致します。

  • データベースに書き込むときの排他処理

    ASP3.0 IIS5.0 ASP初心者です。初心者の素朴な疑問なんですが、 ASPで、例えばWebページから入力された情報を、 Accessなどのデータベースに書き込むとき、 排他処理って必要ですよね? 一般的にどうやるのでしょうか? Application変数を使うのでしょうか? データベース自体に排他制御する機能があるのですか? よろしくお願いします。

  • 排他制御の方法

    現在、PWS+ASP+ACCESSを使用し開発を行っていますが排他制御で悩んでいます。 ASPは、ステートレスなセッションでの制御しか出来ないため、ページを表示後のデータの変更はスタンドアロンでの更新のような形になってしまうと思います。 以下のような方法で行っている実例を見たことがありますが、少なからず問題も抱えていると思います。 ・レコード毎に排他フラグを保持する ~ 処理がアベンドした場合にフラグが残る(一定時間後に解除という方法もありますが) ・レコード毎に更新時間を持ち、読込時の更新時間と更新時の更新時間とを比較し更新されていない時だけ更新をかける ~ 後に更新をかけようとした変更が無駄になる 上記の方法以外で、排他制御を実現させる良い方法はないのでしょうか。他の方法で実現しているときは、その方法を教えて頂けませんでしょうか。 ※PWS→IIS、ACCESS→SQLServerに変更する可能性はあります。 (セッションオブジェクト・アプリケーションオブジェクト等を使用しての実現方法など) 宜しくお願いします。

  • Access2003での排他制御

    Access2003での排他制御 顧客管理をAccess2003で行っています。 新規で登録するときに顧客IDの重複チェックを[顧客ID_LostFocus]内で DCountを使って行っています。 [cmd登録_Click]で Set db = CurrentDb Set rst = db.OpenRecordset("顧客情報") With rst .AddNew ![顧客id] = me.txt顧客ID.value ![顧客住所] = me.txt顧客住所.value ![顧客TEL] = me.txt顧客TEL.value ・ ・ ・ .Update End With 以上の処理を行っています。 (1)Aさんが新規登録で顧客IDを入力 (2)重複されていないので顧客名や住所の入力をおこなう。 (3)Bさんが同じ顧客IDで新規登録 このケースの場合、 Aさんはまだ登録処理が済んでいない(登録ボタンを押していないためテーブルに反映されていない) ので(3)ではBさんの顧客IDは重複されていません。 Aさんが入力中の顧客IDをBさんが入力した時に「他のユーザーが使用しています」みたいな メッセージを表示するにはどのようにしたらよろしいでしょうか?? 文章が上手く書けなくてもうしわけありません、 何卒宜しくお願いいたします。

  • EmEditorについて教えてください(排他制御、diff)

    EmEditor Professionalの購入を検討していて、ダウンロードして少し試用したのですが、わからないことがありますので教えてください。 (1) ファイルアクセスの排他制御は可能でしょうか?   ネットワーク上で自分が編集しているときに他の人が   編集できないようにしたいと思います。 (2) diffの機能があるのは確認したのですが、diffの結果が1つの   画面の中に差分が上下に並んでに表示されます。   これを2画面に横に並べて結果を表示することは可能でしょうか?   結果を横に並べたほうが見やすいので... 以上、よろしくお願いします。

専門家に質問してみよう