• ベストアンサー

排他制御の仕方

hersheの回答

  • hershe
  • ベストアンサー率55% (5/9)
回答No.2

こんにちわ。hersheといいます。 DB更新処理の排他制御はトランザクションを使うことによって実現できます。 ASPでは、ページ単位のトランザクションがサポートされていますので ASPソースの一番上に <%@TRANSACTION=REQUIRED Language=VBScript %> と記述して下さい。 そのページにトランザクションがかかります。 DB登録終了後に、コミットまたはロールバック処理を行なってください。 '*** サンプル *** <%@TRANSACTION=REQUIRED Language=VBScript %> <%   Option Explicit   On Error Resume Next   -- DB登録処理 --   'エラー判定   If Err.Number = 0 Then     'コミット     ObjectContext.SetComplete   Else     'エラーの場合、ロールバック     ObjectContext.SetAbort   End If %>

関連するQ&A

  • MDBの排他制御

    こんにちわ。 いまACCESS2000をデータベースにして,VBでクラサバ構成を実現しようと しています。 そこで2つのプロセスから同時にMDBのあるテーブルを更新しようとすると,ロック状態になってしまいます。 MDBでこのような状態を回避するのはどうすればよいでしょうか? 教えてください。 よろしくお願いします。

  • 排他制御に関して

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

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

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

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

  • Accessでの排他制御

    アクセスの排他制御に関して質問です。 ネットワーク上のサーバーにアクセスのMDBを置いて、複数の人が更新目的で開く場合、排他制御はどうなるのでしょうか? テーブル単位で、ロックが掛かるのでしょうか? もしそうであれば、複数の人が同時に使えないのですが、回避策はありませんでしょうか?

  • Oracleの排他制御について教えてください

    質問内容は結論から言うと、 INSERT文の時の排他制御について 知りたい。 以下の私の認識を踏まえた上で、 INSERT文の排他制御について 質問させてください。 なお、私の認識に誤りがあれば 指摘してください。 ### 私の認識 start ###### 1)Oracle では、select文の時に for updateを 書かなければ、なんのロックもかからず、 読み取り専用リソースへのアクセスで ない限り、 ダーティーリードの可能性がある。 2) select文で for update を指定した場合は 該当行について 共有ロックがかかる。 行単位の共有ロックがかかる。 その際、 他のトランザクションが for updateつきで selectしてきても、 共有ロック同士なので、 互い排他制御しない。 (3) update 文の場合は 該当行について、 占有ロックがかかる 行単位の占有ロックがかかる。 (4) INSERT文の時には、 ロックをかけようにも INSERT前の段階では、 ロック対象行は存在しない。 複数のトランザクションが INSERTした行のPK の値が偶然同じであった場合 ロストアップデートの危険があるので 私の創造では、INSERT文の時は テーブル全体をロックしないと、 うまくいかないように思えます。 (5) update, insert文については、 Oracleでは、自動的に該当行について 占有ロックを行う。 なお、INSERT文については、 下記の質問事項における疑問点 が解消されていないため、 行単位なのかどうか、私の中では 自身がもてないのが現状です。 ### 私の認識 end ###### ### 主な質問内容 start ### 私の認識の(4)を踏まえた上で INSERT文の時のはいた制御 の範囲や挙動について、 教えてください。 ### 主な質問内容 end ### 以上です。

  • 排他制御について

    普段は排他制御として閲覧のみOKにしています。 最近、txtファイルをメモ帳で修正されてしまう事件が 連続2件発生してしまいました。 つまり排他制御をかけているソフトが終了したため、 ロックが解除されて、その後にメモ帳で上書きされてしまいました。 このため、閲覧も禁止にしたところ、不便だと文句が出ました。 メモ帳は原則禁止にすべきと考えていますが、 皆様はどう思われるでしょう。そこまで厳しくしなくてもいいのでしょうか。

  • 排他制御について

    初めまして。 今回初めての投稿になります。 至らないことが多々あるかと思いますがその時は、ご指摘ください。 本題に、入りますと 今アクセスカウンターを作成してるのですけど。 サーバーでflock関数が使えないようなので、排他制御をmkdirでしようと色々調べていたのですが 下のようなサンプルを見つけ色々いじってみたんですが(下記はサンプルのままです。途中にechoがあったので消しておきましたが。) 疑問があります。 $dirnam = "lock"; $scnt0 = 0; while(mkdir($dirnam) === FALSE){ if ($scnt0++ >= 3){ rmdir($dirnam); exit(); } sleep(1); } $scnt0 = 0; while(mkdir($dirnam) === FALSE){ if ($scnt0++ >= 3){ rmdir($dirnam); exit(); } sleep(1); } rmdir($dirnam); 1:3行目は、下記の用に記述では何か問題があるのでしょうか? if(mkdir($dirnam) === FALSE){ while($sct0++ >= 3){ rmdir($dirnam); exit(); } sleep(1); } 2:この構文だと同時アクセスした時に、仮に最初のアクセスが3秒以上かかった場合(ほぼそんなことは、ないだろうと思いますが)lockディレクトリーを消してしまう可能性があるかどうかです。 PHPは、初心者です。 よろしくお願いします。 OS:XP サーバー:レンタル(ホスティング) PHPver:PHP5.3.1

    • 締切済み
    • PHP
  • 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さんが入力した時に「他のユーザーが使用しています」みたいな メッセージを表示するにはどのようにしたらよろしいでしょうか?? 文章が上手く書けなくてもうしわけありません、 何卒宜しくお願いいたします。

  • 「WINRAR」の排他制御

    PCのアーカイブソフト「WINRAR」でRAR書庫内のファイル内容を更新して上書き保管しても書庫内のファイル更新日は変わらず、再度開き確認しても更新が反映(保存)されていません。 書庫を閉じる段になるとエラーメッセージ『これらのファイルは外部の編集アプリケーションを閉じてから圧縮できます』が出ます。 「書庫に戻る」か「(更新を破棄して)書庫を閉じる」の二択しかなく、書庫に戻っても更新されていないファイルが残っているだけでです。 そこで再度そのファイルを開いて更新しても同じことの繰り返しで更新を反映させることは出来ず結局、更新破棄の一択になります。 ファイル更新したタスク(アプリ)は既に終了しているのに排他制御されています。 「(更新を破棄して)書庫を閉じる」を選択するまでは、【一時ファイル用フォルダー】に、更新が反映されたファイルが残っていますが、書庫に保存されずこのような作業ファイルがどんどん増殖していくだけで結局、書庫に保管することは出来ず書庫を閉じた際にこれらは消去されます。 妙な排他ロックが掛かるファイルは、エクセル、テキスト、PDFなど形式・アプリを問わず発生します。 同じファイルでも排他ロックが掛かったり、掛からなかったり再現の規則性は不明です。 書庫を一旦閉じて再度開いてやり直しても、妙な排他ロックの再現規則性は不明です。 WINRARはVersion6.21、Windowsは10の22H2(適用可能な更新は全て当ててあります) 現在は、書庫内データを大幅更新する際は、閉じる前に更新部分を別にコピペしておき、妙な排他ロックの際には気長にコピペ先から元書庫への更新作業を繰り返して、無事に更新が反映されるまで根気よく使っています。 原因、対策を教えてください。