• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:排他方法)

排他方法

このQ&Aのポイント
  • 排他方法の実施について質問します。環境はWindowsXP、Oracle9i、VB6.0です。マスタメンテナンス画面の開発中で、UPDATEやDELETE処理の前に排他処理を行いたいです。DbCreateDynasetの引数を実施する必要があるのですが、排他ロックは正しく行われているのかわかりません。
  • マスタメンテナンス画面の開発中、LOWのUPDATEやDELETE処理の前に排他処理を行いたいです。DbCreateDynasetの引数を使用していますが、正しく排他ロックが行われているのか確認できません。
  • WindowsXP、Oracle9i、VB6.0の環境でマスタメンテナンス画面の開発を行っています。LOWのUPDATEやDELETE処理の前に排他処理を行いたいですが、DbCreateDynasetの引数の実施方法がわかりません。マニュアルがなくて困っています。

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

  • ベストアンサー
回答No.2

多分、DbCreateDynasetの引数には、該当のものはありません・・・。 LOOP中のEDITメソッドで、カレント行のロックはかかりますが、 事前にまとまった行単位でロックする場合は、SELECT文にFOR UPDATEを使用しなければならないと思います・・・。 改めてドキュメント見てみましたが、無理そうですね・・・。

sin002
質問者

補足

了解致しました。 お手数お掛けしてしまい申し訳ございません。 ちなみにLOOP中のEDITメソッドでかかるロックとは DbCreateDynasetの関数が実行中の際にだけロックがかかっている といった事なのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

>>ちなみにLOOP中のEDITメソッドでかかるロックとは >>DbCreateDynasetの関数が実行中の際にだけロックがかかっている >>といった事なのでしょうか? あくまでも「カレント行に対して」ですよ? UPDATEするためにDynasetの内容をEDITする訳ですから、COMMIT(ROLLBACK)されるまでの間はロックされます。 これは質問者さんの意図するロックとは、まったくの別物ですが・・・。

sin002
質問者

お礼

taka451213様。 お返事が遅くなりまして申し訳ございません。 DbCreateDynasetでの排他は無理のようですね。 サンプルで使用したPGを運用しているチームに確認をして SQLで明示的に”FOR UPDATE”を宣言するよう 話をしてみます。 ご指導頂きありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

こんばんは。 UPDATE(DELETE)の対象となるレコードをロックしておきたいのですよね? >>s_Sql, '<-更新対象を抽出するSELECT文がセット' このs_Sqlで明示的にロックすればいいかと・・・。 SELECT xx FROM xx FOR UPDATE;

sin002
質問者

補足

ご回答ありがとうございます。 SELECT文にFOR UPDATEを付けられればよいのですが、 コーディング規約上、DbCreateDynasetの引数で排他をかけなくては ならないのです;;

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 排他制御の仕方

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

  • 1台のServerで複数のコンピューター名でソフトを同時起動する方法?

    リモートデスクトップ系のソフトを使用してサーバーにてソフトウェアを同時起動するに際しての質問です。 ServerOS WINDOWS2003server    DB Microsoft SQL Server2000 ClientOS Windows2000 or xp 自社で開発したDB系ソフトを同時起動するのに、排他処理をコンピュータ名で判断させている為に同時に起動すると排他処理が効かずデータが壊れてしまいます。 そこで設計からやり直すと、2ヶ月程度の工数が発生してしまう為、OS側でコンピューター名を切り替えながらソフトを同時起動させる方法が無いかと調査しているのですが、なかなかたどり着けません。 もし、そのような方法があればお教えいただければと思います。 宜しくお願いします。

  • Accessの排他制御をどのように行うべきか

    いつもお世話になっております。 Windows2000 Access2002、またはAccess2000にて、 複数のPCで、サーバにおいてあるmdbファイルを使用するシステムを開発する場合、 (例えば、スタンドアロンで使用していたシステムを複数のPCで使用することになったと仮定します。 また予算の都合上、Oracle、SQL Serverなどは使えないものとし、各PCにAccessがインストールされます。 ) 排他制御を行うために、Accessで排他モードで開いて使用するという対応というのは、問題ないのでしょうか。 データが破損する可能性があるということをよく耳にするのですが、 過去に上記の対応を行われた方がいらっしゃいましたら、その後の運用で問題は発生しなかったか(ファイルが壊れる事はないのか)、 過去に壊れた事象をお持ちの方がいらっしゃいましたら、どのように対応されたのか、 別の対応方法をとられていらっしゃる方は、その対応方法を ご教授いただけないでしょうか。 プログラムでデータの破損を退避できるのであれば、上の対応と併せて開発できそうな気はするのですが、、 ご回答、よろしくお願いいたします。

  • DELETE文のWHERE条件にSUBSTRを使いたい <DB2+Java1.4>

    DB2+eclipse2.1で開発しています。 テーブルのデータ削除に条件を付け加えたいのですが、 strSql = "DELETE FROM スキーマ名.テーブル名 WHERE substr(ABC,1,6) < " + "200404"; というように、SQL文を書くと、 ------------------------------------ [IBM][CLI Driver][DB2/NT] SQL0440N 互換引き数を持つタイプ "FUNCTION" の名前 "SUBSTR" の許可ルーチンが見つかりませんでした。 SQLSTATE=42884 ------------------------------------ 上記エラーが出ます。 DB2でSUBSTRって使えると思うのですが。 ご存知の方いましたら、教えてください。 よろしくお願いします。

  • Javaの開発環境

    Javaの開発に携わっている方にお尋ねします。 今回の開発環境指定は (1)Java:現在の最新バージョン (2)OS:Windows98以降 (3)DB:MySQL/Oracle/Microsoft SQL Server ※FreeはMy-SQL。その他はトライアルを入手してください。 (1)と(2)は解決済ですが、(3)のDB開発環境のインストールが分かりません。 どなたかDBの環境設定のインストールについて教えて下さい。 また、DBの環境設定について詳しく載ってるHPがあればそれも教えて頂けると助かります。 よろしくお願いします。

  • 単純ですが、意外と穴?なデータベースリソースの鮮度

    よろしくお願い致します。 環境PHP5.2.5 / SQLite3 /*---------------------------------------- * インサート -----------------------------------------*/ $sql_1 = 'INSERTなんたら~(id = 25 を作成)'; $db_pass = 'db_hoge.sqlite'; $db_res = sqlite_open($db_pass); //★タイム(1) $result = sqlite_query($db_res,$sql_1);      :   ~ INSERT処理($sql_1)をしてます ~      : //sqlite_close($db_res) ここではクローズせず      :      : /*---------------------------------------- * デリート -----------------------------------------*/ $sql_2 = 'DELETEなんたら~(id = 25 を削除)'; //省略しちゃうわけです。$db_pass = 'db_hoge.sqlite'; //省略しちゃうわけです。$db_res = sqlite_open($db_pass); //★タイム(2) $result = sqlite_query($db_res,$sql_2);      :   ~ DELETE処理($sql_2)をしてます ~      : /*---------------------------------------- * /処理完了 -----------------------------------------*/ //ここで、ようやく、クローズ sqlite_close($db_res); //============================================== 何が疑問かと言いますと、 ★タイム(1)と、★タイム(2)の時点では、 $db_res の中身の鮮度が違うのでは?と思うわけです。 つまり、 ★タイム(1)の時点では、id=25のデータは作成されていません。 ★タイム(2)の時点では、id=25のデータは作成済みです。 id=25が作成されていない状態のDBリソースを、 ★タイム(2)の所で、使用しています。 言い換えると、 id=25が存在していないDBのリソースを、 タイム(2)の時点で使用し、 そのリソースをもとに、 id=25のデータを消そう(DELETEしよう)としているわけです。 「//省略しちゃうわけです。」 という所で、省略する場合と、しない場合とでは、 結果はやはり異なるのでしょうか? 検査対象がリソースだけに、調べにくいなと思い、 質問させて頂きました。 どなたか、この辺りの正式な作法も含めて、 教えて頂けてませんでしょうか。 上記の「//省略しちゃうんです。」の方法で、 問題ないですよ、 ということであれば、今後も、省略しちゃう方向で、 コーディングしていこうと思います。笑

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

    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の排他制御に詳しい方や 同じような現象に陥った方がいましたら、ご教授お願いします。

  • SQLのIN句について

    DB:Oracle9i SQLのIN句のカッコ内は、何個まで書けるなど、制限はあるのでしょうか? PRO_KEY = IN (no1, no2, no3・・・)など、カッコ内が可変で、数百個、もしくは数千個ある場合、IN句を使用しデータを一度に取得するのではなく、PRO_KEY = no1のSELECT処理を発行、PRO_KEY = no2のSELECT処理を発行・・・し、ARRAYに検索結果を1つずつ詰めていく方が良いのでしょうか? 初心者で恐縮ですが、どなたかご教授ください。

  • SQL*PLUSでファイルからDELETE文

    お世話になります、 Oracle8のSQL*PLUSを使用方法についての質問です。 ローカルにファイル(delete.sql)を作成して SQL*PLUSからそのファイルを流してファイルの中身の処理を実行するという方法をご存知の方が いらっしゃったらおしえてください。 --delete.sqlの中身--------- delete from table_a delete from table_b delete from table_c delete from table_d delete from table_e 以下省略 よろしくお願いします。

  • oracle8iの使用経験のある方お願いします。

     今度、社内のシステムでolacle8iを使うことになりました。  それで、今までお使いになったことがある方に、使用しての感想、気になったことなどのご意見をお聞きしたいと思います。  特に開発者、またはDB管理者のご経験がある方なら、更にうれしく思います。  私はこれまで、oracle5、postgreSQLの経験はありますが、oracle8iははじめて使います。ですのでSQLに関してはそこそこ使えると思うのですが・・・。  小さなことでも結構ですので、よろしくお願いします。

このQ&Aのポイント
  • 家のどこかにキャッシュカードを失くしてしまいました。再発行には有人窓口ならどこでも再発行可能ですか?
  • 高校生の自分だけで支店に行き、再発行することは可能ですか?
  • キャッシュカードを再発行するためには、有人窓口に行く必要があります。高校生でも再発行は可能ですが、身分証明書が必要です。手続きの際には手数料がかかる場合があります。
回答を見る