• ベストアンサー

排他制御について

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

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

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

結論だけ言えば「出来る」でしょう。 しかし状況がはっきりしません。 1.Bは参照だけでよい 2.Bは、Aの処理が終わった後データを変更したい 3.上記2.であれば、処理可能になった通知が欲しいのか など、です。 しかし何も考えずに作っても、データベースがかなりカバーしてくれるような気もします。A01のデータに対し複数の変更が行われれば、それなりの警告を出してくれます。 まずはプロトタイプを作成し、上記状況を実験してみてはいかがでしょう。一台のPCからでも実験できるはずです。

0000hiro
質問者

お礼

テストしてみてもっと効率の良い方法が見つかりました。いろいろ試してみるもんですね。

関連するQ&A

  • 排他制御について

    質問があります。 Access2003とSQLserver2005の排他制御についてです。 複数のPCから共有してアクセスし、レコード単位に排他制御したいといった場合、 排他制御に適しているのはどちらでしょうか? 「Accessではこういう問題があり適さない」などあったら教えてください。 よろしくお願いします。

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

    いつも的確な回答に助けられています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
  • 排他制御の方法

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

  • SQLServerにおける、排他制御に関して質問です。

    SQLServerにおける、排他制御に関して質問です。 環境:  SQLサーバ  ・Windows 2003 Server SP2  ・SQL Server 2005 Standard Edition SP3  SQLクライアント  ・WindowsXP SP3  ・.NET Framework 3.5 SP1 VB.NET アプリ  DBアクセサ  ・ADO.NETを利用 ---------------------------------------------------------------------- 1.DBとのコネクションを確立        ・        ・        ・ 2.データベーストランザクションを開始(レベルはSerializable) 3.テーブルAに対してINSERTを実行   (テーブルAの主キーはオートインクリメント設定されている。) 4.3の結果、追加された主キーを取得するため、MAX()関数にて主キーの最大値(つまり、3で追加した行のはず)を取得 5.テーブルAを外部参照しているテーブルに対して、4で取得したテーブルAのキーを利用して、行を追加・更新などを行う。 6.コミットを行う。   (コネクションは、アプリケーションが終了するまで保持する・・・) ---------------------------------------------------------------------- この処理フローで実行していたシステムですが、 二つのクライアント(X,Y)から、同時に2からの処理が行われた際に排他されず、 Xが、Yが作成したレコードの主キー値を元に、5の更新を行ってしまいました。 ログを見ると、 2→成功 3→成功(別のレコードが作成された) 4→XがMAX関数にて、Yが作成したレコードの主キーを取得   ※処理そのものは成功しているが、論理的におかしい となっています。 論理的には、トランザクションをかけているので、3からの処理が同時に行われるはずはなく、 4で取得される番号も、それぞれが作成した行の主キー番号になるはずなのですが・・・。 論理的に見落としている点や、環境的な要因などで、考えられる原因はありますでしょうか・・・?

  • VB.NET 排他制御

    VB.NET ORACLE9iです。 あるWebシステムをVB.NETで開発しています。 やりたいことは、画面の排他制御です。 つまり、ある画面(検索結果一覧表示)を表示できるのは同時に1ユーザのみとしたいのです。 その画面を見終わった(他画面に移った)タイミングが分かりません。 ご教授をお願いします。

  • 排他制御。

    現在ASPで作成しているプロジェクトでは ページが三つあります。 1ページ目でデータを選択し、排他をかける。 2ページ目でデータを更新して、 3ページ目で排他を解除しています。 この際2ページ目でページを閉じられた場合、 排他を解除しなくてはならないのですが なにかいい方法はありませんか? また、ブラウザの戻るボタンを押されたときにも 排他を制御しなくてはなりません。 なにか判断する方法はないでしょうか?

  • 排他制御の仕方

    X_DBから条件取得し、Y_DBへデータを移し変える処理を画面PGで行っています。 (移し終わると、該当のレコードはX_DBから削除) この時、複数端末で同時に処理されると、X_DBの対象レコードが重複して選択されるため、排他処理を行いたいのですが、ORCLEでどの様な記述をしたらよいのでしょうか?

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

    トリガに排他制御をかけたいのですが 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されなくなることを危惧しているためです。

  • javascriptで排他制御

    いつもお世話になっております。 現在、AJAXを使って、10秒に一度サーバのデータを受けて表示するというものを作成しています。 その際、キープアライブという形で別の通信をしているのですが、運悪くその二つの応答が重なってしまうと、データ表示がおかしくなってしまいます。 これではまずいので、一つの通信が終わるまでもう一つの通信を始める時間になっても待っているようにする、排他制御がしたいのですが、javascriptで実現可能なのでしょうか? C++でいうとcriticalsectionのようなものがほしいですが見当たらなかったので、ご存知の方がおられましたらご教授願います。

  • 排他ロックしたレコードが、別トランザクションから参照されてしまい困っています。

    SQL Server2000を使用し、 あるトランザクションで排他ロック(XLOCK)をかけたレコードが 他のトランザクションから共有ロックを使用し参照できてしまう状態は存在するのでしょうか? 排他ロックをかけたレコードが 他のトランザクションから参照できてしまい困っています。 現在、下記の環境で開発を行っております。 ・サーバ側 Windows Server2003 SQL Server2000(sp4) ・クライアント側 Windows Xp(sp3) jdk6.0 jdbc 3.0 Type4 以下が具体的な状況となります。 前提として、 ・二つのトランザクション(以下A、Bと表記します)が存在する。 ・AとBは別のユーザでコネクションを張っている。 ・autoCommitはfalseに設定している。 ・テーブルにプライマリキーやインデックスは張っていない。 ・レコードは10件。 ・分離レベルはREAD COMMITED (1)Aから、「SELECT * FROM TEST_TABLE WITH(XLOCK) 」を発行 (2)Bから、「SELECT * FROM TEST_TABLE」を発行 このような状況で、(1)、(2)の順で処理を行った場合に 私の認識では、(2)の検索時にタイムアウト等が発生するという認識です。 しかし、(2)のSQLは正常に終了し、(1)と同じデータが取得されてしまいます。 ◆その他、確認したこと ・(1)の処理直後に処理を停止し、Enterprise Managerでロックが取得されているか確認したところ、トランザクションAがすべてのレコードを排他ロック(X)していた。 ・(2)の処理直後にロックの状態を確認しても、やはりトランザクションAが、排他ロック(X)していた。 ・CSEを使いODBC経由で同様の操作を行った場合も同じ動作がおこる。 ・(1)WITH(XLOCK, TABLOCK)とすると(2)でデータが取得できなくなる。 ・(2)のSQLを「SELECT * FROM TEST_TABLE WHERE COLUMN01 > 0」のように指定するとタイムアウトする(期待通りの動き) ・(2)のSQLを「SELECT COLUMN01 FROM TEST_TABLE WHERE COLUMN01 > 0」のように指定すると、今度は、なぜか取得出来てしまう。 ・(1)と(2)の間にトランザクションAでUPDATEなどを行うと(COMMITはしない)(2)のSQLのWHERE句や取得するカラムに関係なく、(2)のSQLはタイムアウトする(当り前か。。。) いろいろ書きましたが、排他ロックされたレコードに 共有ロックはかけれないという認識なのですが、 そうではないのでしょうか? また、そうではない場合どういった場合に、 共有ロックが可能となるのでしょうか? SQL Serverの排他制御に詳しい方や 同じような現象に陥った方がいましたら、ご教授お願いします。