
データベースを勉強中の者です。ロックの種類についてどなたかご教示いただけますでしょうか。
ロックの種類は、次の三種類ですよね。
・共有ロック
・排他ロック
・更新ロック
共有ロックの意味は理解できていると思うのですが、更新ロックがよくわかりません。
更新ロックにすると次のように動作するそうですね。
1.更新を前提にして共有ロックをかける。
2.更新する前に排他ロックに切り替わる。
排他ロックも更新時に使うロックですが、排他ロックと更新ロックの違いというか、使い分けがよくわかりません。
データを更新するためには排他ロックをかけないといけないのはわかりますが、その前に共有ロックをかける意味は?
http://f29.aaa.livedoor.jp/~snaka/PukiWiki/PukiW …
上のサイトを読んで「デッドロックを回避するため」といったんは理解したのですが、上司は「更新ロックとデッドロックは関係ない」と言います。
私の解釈が間違っているのでしょうか。それとも上司?
No.4ベストアンサー
- 回答日時:
sqlcmdのプロンプトを二つ立ち上げて
(トランザクション1)
begin tran
go
select * from テーブル with ( updlock ) where 条件
go
(トランザクション2)
update テーブル set 項目 = ~ where 条件
go
として見てください。トランザクション2は待ちになります。
トランザクション1のselect文の with ( updlock ) を取ると待ちになりません。
えーと、それはSQLServerでしょうか。今手元に使える環境がないので残念ながら確認できないのすが、トランザクション1がwith ( updlock )つきのSelectを実行すると トランザクション2が待ちになるんですよね。
その状態でトランザクション1にend tranを実行すると、トランザクション1は終了してしまい、トランザクション2は待ちが解除されて実行になると考えていいですか。
あと、更新ロックはデッドロックをある程度防げるのかどうか教えていただけるとうれしいです。もしかして「一概に言えない」ということなのでしょうか。
No.3
- 回答日時:
更新ロックはSELECTで WITH ( UPDLOCK ) を指定した時の場合ですね。
一方、排他ロックはINSERT,UPDATE,DELETEを直接実行した場合発生します。
ですので、SELECTで値を取得して、その値に応じて処理を分岐したいなどの場合に使われます。
回答ありがとうございます。
少し明かりが見えてきた気がします。
・INSERT,UPDATE,DELETEをいきなり実行すると排他ロックになる。
(特にSQL文に指定はしない?)
・INSERT,UPDATE,DELETEの前にSELECTで WITH ( UPDLOCK ) を指定すると更新ロックになり、その後のINSERT,UPDATE,DELETEの実行で排他ロックになる。
という理解で間違っていないでしょうか。
ある程度デッドロックを防げるのかどうかも教えてくださるとうれしいです。
SELECTで WITH ( UPDLOCK )を実行して更新する範囲を宣言、そこでエラーになるなら待ちの状態になるのかな、と想像しています。
No.2
- 回答日時:
以下をご参照ください。
http://www.atmarkit.co.jp/fdotnet/entwebapp/entw …
更新ロックと排他ロックの違いは、その期間中に共有ロック(読み込み)を
許すかどうかです。
#どちらを使うべきかは、何を優先すべきかで違う・・
回答ありがとうございます。
そのページは何度も読んだのですが、完全には理解できないでいます。
あるレコードを読もうとしたら他のトランザクションが排他ロックをかけていたとします。
自分も排他ロックならエラーになり、更新ロックなら共有ロック待ちとなるのだ(そのおかげでデッドロックがある程度回避できるのかな)と考えているのですが、間違っていますか。
No.1
- 回答日時:
> 上のサイトを読んで「デッドロックを回避するため」といったんは理解したのですが、
> 上司は「更新ロックとデッドロックは関係ない」と言います。
関係ない訳ではなく、それとは別のデッドロック問題があり、
一般にデッドロックというとそちらの問題を指すということです。
(1)AプログラムがXテーブルのX1レコードをロック
(2)BプログラムがYテーブルのY1レコードをロック
この状態で
(3)AプログラムがYテーブルのY1レコードをロックしようとする
(4)BプログラムがXテーブルのX1レコードをロックしようとする
これが一般に言われるデッドロック問題です。
回避方法は、XとYのどちらを先にロックするのかをシステム内で統一する。
デッドロックのご説明ありがとうございます。かならずXテーブル→Yテーブルの順でロックすればデッドロックの頻度は減りそうですね。でも同じテーブルの別レコードに対してだと効果はないということでしょうか。
目下知りたいのは排他ロックと更新ロックの違いと使い分けなので、それについてご教示くださればと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 運転免許・教習所 運転免許証の暗証番号を勘違いで間違えてしまい、ロックされてしまいました。正しい暗証番号はもう分かって 1 2023/01/30 17:32
- Amazon Amazon アカウントはどうすると変更できる? 5 2022/04/10 07:09
- 格安スマホ・SIMフリースマホ SIMカードのロックについて 1 2022/03/29 15:02
- Android(アンドロイド) Xperia5Ⅲ 2 2022/08/31 01:32
- Android(アンドロイド) auのAndroid端末のSIMカードがロックされてしまいました。 6 2022/08/22 20:31
- 格安スマホ・SIMフリースマホ SIMロック解除 ①スマホ本機は同一機種でも通信事業者を変更するごとに「SIMロック」は掛かる物です 4 2022/08/27 17:29
- X(旧Twitter) Twitterについて 機種変更して新しい端末からログインを何回か間違えてしまってここから変わりませ 1 2023/03/13 13:30
- gooのスマホ 機種変更したのでフリマアプリでiPhoneXRを売ろうと思っているのですが、 SIMロック解除する前 2 2022/06/05 17:32
- Android(アンドロイド) メルカリでスマホ新品未開封 どうやってやっている? SIM を他のスマホで開通させるですよね 3 2023/01/10 02:20
- docomo(ドコモ) SIMロック、またはSIMロック解除の仕組みをおしえてください。 5 2022/04/25 10:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessのロック
-
SELECT時の行ロックの必要性に...
-
SELECT文でのデッドロックに対...
-
排他ロックしたレコードが、別...
-
デッドロック
-
更新ロックとデッドロック
-
SQL Server2005で変換デッドロ...
-
デッドロックが発生します。
-
SQLServerの明示的なロックの仕...
-
Oracleの排他制御について教え...
-
UPDATE文で発生するデッドロッ...
-
同時書き込み
-
DB2でSelectした時(rollback,c...
-
「マスタ」と「テーブル」の違...
-
accessテーブル作成クエリを実...
-
3つ以上のテーブルをUNIONする...
-
クエリのキャンセルがいつにな...
-
Accessにインポートしたら並び...
-
行方向のデータを横に並べる
-
Insert Into Select での重複に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT文でのデッドロックに対...
-
SELECT時の行ロックの必要性に...
-
SQLServer Insertが遅い
-
accessのロック
-
Oracleの排他制御について教え...
-
AccessShareLock はどの程度気...
-
SELECT文でタイムアウト...
-
UPDATE文で発生するデッドロッ...
-
INSERTにおいてロック処理は必要か
-
DB2でSelectした時(rollback,c...
-
max+1で初番する場合 for updat...
-
排他ロックしたレコードが、別...
-
更新ロックとデッドロック
-
パススルークエリでのロックに...
-
ExcelからAccess2013DBを更新す...
-
同一トランザクションの中でテ...
-
デッドロックが発生します。
-
トランザクション中にSELECTし...
-
同時書き込み
-
SQLServerの明示的なロックの仕...
おすすめ情報