• 締切済み

リンクテーブルに対する一括削除でロック違反発生

<環境> OS;Windows7 DB:Oracle11g AP:ACCESS2003(2000形式) お世話になります。 フォーム上で検索条件を指定し、検索を実行するとサブフォームに抽出結果を出力する。。。 といったものを作成しています。 検索実行時には (1)前回の検索結果を取引テーブルWKから削除 (2)指定した条件を基に取引テーブルから取引テーブルWKへテーブル追加 (3)サブフォームで表示 このような流れでコーディングしています。 この中で、(1)を実行すると必ずロック違反(「10件中9件でロック違反」「25件中24件で ロック違反」...など)が発生してしまう状況です。 各テーブルはOracle11gからのリンクテーブルとなり、ローカルテーブルとした場合には発生しません。 その他、確認している状況としては・・・ ・フォームを閉じた状態で(2)の追加SQLを実行後に(1)の削除処理を行っても同様の現象が起きる ・フォームが閉じた状態で(2)の追加SQLを実行後に取引テーブルWKを開き手動で削除なら再現せず。 ・Oracle11gのテーブルに対して直接(Object Browser利用)SQLを実行した場合には再現せず。 現象の発生状況から見て、ODBCに原因があるか、或いは使用しているACCESSのバージョンが古い事が原因なのか。。。 アドバイスをいただけますと幸いです。

みんなの回答

  • IDii24
  • ベストアンサー率24% (1597/6506)
回答No.1

オラクルは正直です。開いているデータにたいして削除は出来ません。アクセスでフォームをソースにして開くという事は全情報を取得して編集対象にしますよと宣言しているようなものです。だからオラクルはしっかりロックしているのです。その人のために。それを横から削除することは出来ません、まずテーブルを解放してください。 ローカルテーブルは自分のものだから削除できるのです。アクセスは使うデータは全部自分の自由という作りです。オラクルは誰のものかを自動判断出来ません。複数の人の使用を前提にしている場合判断させるには判断させるプログラムが必要です。 これはデータベースシステムのプログラミングの基本中の基本でありこれを理解してないとシステムは組めません。 リンクテーブルを過信してはいけません。あれは単にサーバー側に大量の情報を格納する為だけに存在すると考えたほうが良いです。 それでも偶然にロックがかからない場合があります。それはアクセスが投げる処理がたまたまロックと関係ない部分に投げているから。それでも大丈夫だと使い続ける人も多数居ます。それを続けるといずれ破壊もあり得ます。簡単にアプリが組めるのにいまだにスクラッチ開発が続いているわけももなく、スクラッチが必要だから難しい言語を覚える必要があるのです。 つまり簡単にアプリは作れないという事になります。

関連するQ&A

  • 一括テーブルロック デッドロック対策

    はじめまして。 ken7761227と申します。 SQL Server2008R2でデッドロックが発生しまして、本来であれば、テーブルの 参照、更新順を正しくする修正をすべきなのですが、今からその修正を行うのは 困難なために、更新する側が、使うテーブルをまずTABLOCKXでロックしておく という対策をとることになりました。 ここで、A,B二つのテーブルがあったとし、 SELECT XXX FROM dbo.TableA WITH( TABLOCKX ) UNION SELECT YYY FROM dbo.TableB WITH( TABLOCKX ) というSQLでロックしようとしています。 UNIONを用いたのは、2つのセレクトの間に違うプロセスからの割り込を 防止したかったためです。 (このSQLの実行時にトランザクションをかけて、更新後のコミットまで、 排他ロックをかけようとしています。) TableA,TableBを更新しようとしているプロセス1が、上記SQLを実行しオーナーになります。 プロセス2がTableBをSELECTしようとすると、排他ロックで待たされるはずですよね? 実際ここは待たされていました。 また、プロセス2も更新を行おうとし、上記のSQLを実行すれば、プロセス1のコミット までは、処理が待たされるはずだと思っていたのですが、ここでデッドロックしてしまいます。 原因が全く分からずに困っております。 最終的に、やりたいことは、テーブルの参照、更新の順番を変えずに、デッドロックを 回避することです。テーブルロックをかけかたが、間違っていますでしょうか? また、それ以外に何か良い回避方法がありますでしょうか? どなたか、有識者の方々のご助言頂けないでしょうか。 よろしくお願いいたします。

  • ACCESSのテーブルロックについて

    テーブルのロックについて教えて下さい。 ACCESS2000にてテーブル作成クエリを作成し、その作成したテーブルをフォームで参照しています。 そのフォームを開いたままで、再度、同じテーブル作成クエリを実行すると、 「テーブル○○は現在ほかのユーザまたはプロセスで使用されているので、ロックできませんでした。」 というメッセージが表示され、クエリを完了することができません・・・ これを回避する(クエリを優先する)方法、設定があったら教えて下さい。 宜しくお願いします。

  • SQL文を発行すると。。。

    Oracle初心者です。 SQL*PlusであるテーブルにSelect文を発行するといつまでも検索し続けて止まりません(繰り返されているようです)。レコードは一件しか入っていませんので一件だけ検索しても同じです。 他のテーブルはそんなことないのですがあるテーブルだけこの現象が発生します。 列は200近くあります。 ご存知の方いらっしゃったら教えて下さい。よろしくお願いします。

  • access 3211エラー

    access についての質問です。 現在、sqlにてテーブルを作成してそのテーブルをレコードソースとしてサブフォームなどの帳票フォームを表示したりしてるのですが、二回に一回は 【実行時エラー 3211 現在ほかのユーザーまたはプロセスで使用されているのでロックできませんでした】 となってしまいます。 原因はなんでしょうか?

  • UPDATE文で発生するデッドロックについて、教えてください。

    はじめまして。 SQL SERVER初心者の為、ご指導の程お願いいたします。 UPDATE文で発生するデッドロックについて教えてください。 現在、ストアドプロシージャ内で、 以下のUPDATE文を使用しています。 UPDATE テーブルA SET 更新済フラグ = '1' WHERE ロック時間 =パラメータ.ロック時間 AND ロックユーザー = パラメータ.ロックユーザー AND ID = パラメータ.ID ※Where句に使用する、ロック時間・ロックユーザー・IDは、  キー項目では無く、インデックスも使用しておりません。  ただし、対象データを一意に識別できる項目ではあります。   このストアドを含む処理を、ほぼ同時実行すると このUPDATE文で「LOCK TIMEOUT」が発生し、 デッドロックとなってしまいます。 UPDATEの対象となるデータ件数は、ともに500~600件です また、対策としましてロックのヒント文を下記のように設定し、 WHERE句に設定している、ロック時間・ロックユーザー・IDに 対して、インデックスを作成してみましたが、 同様に、デッドロックが発生してしまいます。 UPDATE テーブルA (with rowlock) SET 更新済フラグ = '1' WHERE ロック時間 = パラメータ.ロック時間 AND ロックユーザー = パラメータ.ロックユーザー AND ID = パラメータ.ID SQL Serverに詳しい方、お力になっていただければ、光栄です。 よろしくお願いいたします。

  • AccessからOrcleのODBCリンクテーブルへの挿入

    OS:XPpro Access:97,2000 Oracle:7 AccessからOracleのODBCリンクテーブルに対して追加クエリを実行すると、 ODBC--リンクテーブル'テーブル名'への挿入に失敗しました。 [Oracle][ODBC Oracle Driver][Oracle OCI]ORA-01461: can bind a LONG value only for insert into a LONG column.(#1461) というエラーが発生します。 メモ型のフィールド'A'をvarchar2(4000)のフィールド'B'に追加する部分で、LeftB(A,4000)としている部分がうまく行かないようようなので、LeftB(A,3000)と丸めてあげると通ります。 質問を纏めますと、 1.varchar2(4000)となっていても、4000Byteのデータを挿入することはできないのでしょうか。 2.発生しているエラーは、私の考えとは別の問題なのでしょうか。 ご回答よろしくお願いします。

  • どういう時にテーブルロックを使用するのでしょうか

    PHPのサンプルにテーブルロックがあったのですが、 使いどころが分からないので、教えてください。 どういう時にテーブルロックを使用するのでしょうか。 サンプルの解説だと、 「LOCK TABLES」構文を使って会員と管理者が同時に実行する可能性がある更新と削除で テーブルをロックします、 とあるのですが、 例えば、:INSERTとかでは、テーブルをロックしなくてよいのでしょうか? これまで、気にしたことはなかったのですが、 例えば、(テーブルロックをしていない)掲示板で、たまたま同時に書き込みをしたり、しても、特に問題ないのでしょうか? どういう時に、テーブルロックをして、 どういう時にテーブルロックをしなくてよいか、分かりません。 例えば、同じ掲示板の機能を保持するサイトが複数あった場合、 テーブルロックというのは、 大体、処理別でこういう風にする、と決まっているようなものなのでしょうか? あるいは、データの持ち方によって、 それこそサイト毎に、実装(どこでロックするか等)はそれぞれ変わってくるようなものなのでしょうか?

    • ベストアンサー
    • MySQL
  • CSVへ複数件エクスポートがしたい

    VBでオラクルにアクセスしてテーブルと列をとり 日付によりデータを取るとのですが、一件しかCSVにエクスポートされません 2件3件とエクスポートするにはどうしたら宜しいでしょうか? よろしくお願いいたします。 環境はOS95 VB6 Oracle8 ーーーCSVファイルで表示したい事ーーー "コンテナ番号", "定期点検実施日" CT00001, 1999/12/01 CT00002, 1999/10/23 CT00003, 1998/07/07 複数表示させたい ーーー現在ーーー "コンテナ番号", "定期点検実施日" CT00001, 1999/12/01 一件しか表示されない ーーーソースーーー Wk_Sql = "" Wk_Sql = Wk_Sql & "SELECT *" '全てのの列 Wk_Sql = Wk_Sql & " FROM T_TenkenJsk" '定期点検実績テーブル Wk_Sql = Wk_Sql & " WHERE SUBSTR(T05_DateTenken, 1, 4) <= '" & G_DelYYYY & "'" '定期点検実施日 Wk_Sql = DB_SelectSql(Wk_Sql, Wk_Rs) Open Wk_FDir + "\" + Wk_FName For Output Access Write As #1 Write #1, "コンテナ番号", "定期点検実施日" Write #1, Cv_Null(Wk_Rs("T05_NumContner")),Cv_Null(Wk_Rs("T05_DateTenken")) Close #1

  • Accessのフォームから削除したレコードをテーブルに保存したい

    Accessを利用してフォームからデータを入力しているのですが、クエリを使わずフォーム画面から不必要なレコードをコマンドボタンで削除しています。削除したレコードをテーブルに保存したいのですが、追加クエリで条件を決めずにフォームの画面から判断したレコードだけを削除し、かつ削除したレコードを削除専用のテーブルに追加する方法を教えてください。よろしくお願いします。

  • 削除クエリがエラーになります。

    削除クエリがエラーになります。 Access2007です。削除クエリを作っているのですがどうしてもエラーになります。 「1件のレコードでキー違反。0件のレコードでロック違反が発生したため削除クエリでレコードを削除できませんでした。」と、表示されてしまいます。 な~ぜ???  1つのテーブルを基に作っているのにどうしてエラーになるのかわかりません。「キー違反」「ロック違反」とはどういうものですか?どうすれば治りますか? どうか、よろしくお願いいたします

専門家に質問してみよう