
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で質問しましょう!
似たような質問が見つかりました
- Android(アンドロイド) Googleのファミリーリンクの危険性に気付いてしまったのですが、皆さんの感想を教えてください! 2 2023/05/09 10:01
- 格安スマホ・SIMフリースマホ SIMカードのロックについて 1 2022/03/29 15:02
- 防犯・セキュリティ 鍵屋さんか、鍵に詳しい人に聞きたいですが、 「クレセント錠をかけ、ロックした状態で、外からロックもク 4 2023/03/31 13:48
- 法学 閉じ込め問題について、家電メーカーは責任を持たないのでしょうか? 9 2023/06/14 11:12
- その他(家事・生活情報) 収納ケースをロックしたい 1 2022/09/11 00:23
- 防犯・セキュリティ よく、チェーンロックやU字ロックは 外から簡単に解錠されると言いますよね 私もぼろアパートの時、チェ 1 2023/01/01 17:54
- docomo(ドコモ) SIMロック、またはSIMロック解除の仕組みをおしえてください。 5 2022/04/25 10:57
- バイク車検・修理・メンテナンス スクーターのリアブレーキを行ってから、ロックが外れにくいです。動かすとロックが外れます。 2 2022/04/29 20:25
- その他(スマートフォン・携帯電話・VR) ピンで開けるタイプのSIMスロットのスマホですが、SIMカードの入れ替えで頻繁にピンを使ってスロット 2 2022/12/28 12:24
- Amazon Amazon アカウントはどうすると変更できる? 5 2022/04/10 07:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INSERT文でフィールドの1つだ...
-
テキスト時分のINSERT
-
SQLの条件文
-
MySQLで複数のSELECT文を1文に...
-
SQLServerでの切り上げ処理
-
mysqlのsqlスクリプトエラーに...
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
for whichの使い方
-
エクセルで最後の文字だけ置き...
-
EXISTSを使ったDELETE文
-
外部参照してるキーを主キーに...
-
列番号による項目の取得について
-
エクセルの関数について教えて...
-
不連続サブネットとEIGRPについて
-
IDの欠番
-
SELECT 文 GROUP での1件目を...
-
【VB.NET】日付型の列にNULLを...
-
SQLで特定の項目の重複のみを排...
-
Outlook 送受信エラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INSERT文でフィールドの1つだ...
-
SQLでフィールドの順番を変更し...
-
count集計の結果が0の場合でも...
-
'internal' のシステム メモリ...
-
JOINで1つのテーブルに空白があ...
-
SQL server改行コード
-
SQLについて教えて下さい with(...
-
グループ毎の最大値を持つデー...
-
「重複を間引いた数」をcountし...
-
SQLServerでの切り上げ処理
-
自作関数の方がパフォーマンス...
-
Unionの結果全体をOrder By し...
-
MySQLで複数のSELECT文を1文に...
-
文字列変換ついて
-
SQLでの計算結果がおかしい
-
DB2でのロック
-
SQL Server 2005 Express で CD...
-
一つのSQLで実行できるでしょう...
-
勉強でSNSを作っています。
-
データの間隔が知りたい時
おすすめ情報