
No.1ベストアンサー
- 回答日時:
OracleもDB2もデフォルトのトランザクション分離レベルはRead Committedですがトランザクション制御の実装の仕方が違います。
DB2は検索時に共有ロックをかけます。しかし読み取るデータが更新中の場合はすでにそのデータに排他ロックがかかっているので共有ロックをかけることができません。
Oracleはマルチ・バージョン一貫性制御でUNDO表領域に保持された更新前の情報を読み込むので読み取るデータが更新中であっても検索処理が待たされることはありませんがDB2は更新中のデータに他クライアントはアクセスできないで検索処理が待たされます。
Uncommitted Readでダーティー・リードを許す方法がありますが実用的なアプリケーションにあまり使用されません。
ロック取得時間を短くするような排他制御のアプリケーション設計を行い検索処理と重複するタイミングを減らすことで回避するようにします。オプティミスティックロックの実装方法を用いるようになると思います。
でも頻繁に複数ユーザーが同時に同一データを変更するようなシステムだと更新に失敗する確率が高くなり利便性が悪く場合があります。
SELECT * FROM TABLE FOR UPDATE WITH RS
排他制御が必要な際はその都度、各SQL文にWITH句を用いて分離レベルを指定してください。カーソルオープン前に発行することでCOMMITかROLLBACK時までロックされた状態になります。
ロック待機への対処も異なります。ロック待機をせずすぐに制御を戻す場合、OracleはSELECT~FOR UPDATEにNOWAITオプションを指定しますがDB2ではNOWAITオプションに対応する機能をサポートしていません。ロック待機する時間をLOCKTIMEOUTパラメータで指定するしかありません。
以上の辺を確認してみてください。
この回答への補足
O_cyanさん
回答ありがとうございます。
もう少し質問させてください。
FOR UPDATE WITH RS と教えて頂いたのですが、複数テーブルをJOINしたりすると FOR UPDATE でエラーが出てしまいます。
その場合はどのようにしたら良いのでしょうか。
No.2
- 回答日時:
>複数テーブルをJOINしたりすると・・
table2からID_cdを取得してそれをtable1のID_cdに更新をtable1のA_cdとtable2のA_cdでJOINしたい。みたいな感じのJOINなのでしょうか?詳細不明ですがJOINではなくexistsを使って
update table1 set ID_cd = ( select ID_cd from table2 where table1.A_cd=table2.A_cd )
where exists ( select * from table2 where table1.A_cd=table2.A_cd )
こんな感じになるのでは
質問の内容と違っていたらゴメンなさい。
この回答への補足
O_cyanさん
説明が足りずすいません。
複数テーブルをJOINした形でロックをかけたいです。
その時に、FOR UPDATE をつけるとエラーが発生してしまいます。
例えば、
SELECT A.a, B.b FROM A
INNER JOIN B ON A.ID = B.ID
FOR UPDATE WITH RS
と書いたときに、エラーとなってしまいます。
どのように記述すれば回避できるか教えていただけますでしょうか。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「重複を間引いた数」をcountし...
-
差し込み後、元データを変更し...
-
for whichの使い方
-
特定の文字列で列を区切るには?
-
ソフトバンクの無料着うたのお...
-
SQLで列名を変数にできないでし...
-
SQLで特定の項目の重複のみを排...
-
複数アドインプログラムをひと...
-
一度のsqlで値を取得するには
-
ある条件の最大値+1を初番する...
-
Outlook 送受信エラー
-
誰か教えてください
-
IDの欠番
-
UWSCでMOUSEORG関数が上手く処...
-
php+mysqlで複数選択削除について
-
この意味の違いを教えてくださ...
-
エクセルの関数について教えて...
-
Excel VBA ADODB
-
VMwareがCDドライブを認識する...
-
OSPFのDRの選出基準について シ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INSERT文でフィールドの1つだ...
-
count集計の結果が0の場合でも...
-
'internal' のシステム メモリ...
-
SQLを作ったのですがうまくいき...
-
SQLについて教えて下さい with(...
-
SQLでフィールドの順番を変更し...
-
SQL server改行コード
-
SQLServerでの切り上げ処理
-
「重複を間引いた数」をcountし...
-
JOINで1つのテーブルに空白があ...
-
SQLでの計算結果がおかしい
-
DB2でのロック
-
md5で暗号化して別フィールドに...
-
Unionの結果全体をOrder By し...
-
SQL Server 2005 Express で CD...
-
秒数をDATETIME型に変換して足...
-
MySQLで複数のSELECT文を1文に...
-
グループ毎の最大値を持つデー...
-
外部結合での"OR"文
-
差し込み後、元データを変更し...
おすすめ情報