- - PR -
With (UpdLock) の指定について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-24 15:40
Vb6.0 + SQLServerを使用してい開発を行っています。
Lan接続で、同時に更新処理が可能なように作成する為、 ロックについて勉強中なのですが、 With (UpdLock) の指定について教えて頂きたい事があります。 select 文に対してwith (UPDLOCK,ROWLOCK)を使用した場合、 例:Select * from Tes with (UPDLOCK,ROWLOCK) Where ID = 1 行ロックになりますが、 Update Tes with (UPDLOCK) set Name = 'テスト' Where ID = 1 というUpdate文と Update Tes set Name = 'テスト' Where ID = 1 のUpdate 文の違いが分かりません。 Update 文に対して指定する事で、どのような変化があるのでしょうか? ※SQL関連を検索してもUpdate 文にWithで指定しているようなページは 見つからないのでが、退職された方が残したSQLでUpdate文にWith指定が ついていました。 その為、どのような動作になるのかを調べなくてはいけなくなりまして・・・・ お分かりの方教えて下さい。お願いします。 | ||||||||
|
投稿日時: 2006-01-28 00:05
お疲れ様です。 とりあえず,SQL Server 2000 だとします。 ポイントは,ロックヒントなどは「テーブルヒント」と言われる領域に指定されるオプションだと言う事です。 以下の3つのクエリを実行して, ロックの状態を確認して比較してください。 何が違うのかがわかると思います。 [CODE]--- CREATE TABLE [TBLA] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [DATA] [char] (10) COLLATE Japanese_CI_AS NULL , CONSTRAINT [PK_TBLA] PRIMARY KEY CLUSTERED ( [ID] ) ON [PRIMARY] ) ON [PRIMARY] GO INSERT INTO [test].[dbo].[TBLA]([DATA]) VALUES('A') INSERT INTO [test].[dbo].[TBLA]([DATA]) VALUES('B') INSERT INTO [test].[dbo].[TBLA]([DATA]) VALUES('C') BEGIN TRAN UPDATE [test].[dbo].[TBLA] WITH (UPDLOCK) SET [DATA]='TEST' WHERE [DATA] ='B' --ROLLBACK TRAN [CODE]--- [CODE]--- CREATE TABLE [TBLB] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [DATA] [char] (10) COLLATE Japanese_CI_AS NULL , CONSTRAINT [PK_TBLB] PRIMARY KEY CLUSTERED ( [ID] ) ON [PRIMARY] ) ON [PRIMARY] GO INSERT INTO [test].[dbo].[TBLB]([DATA]) VALUES('A') INSERT INTO [test].[dbo].[TBLB]([DATA]) VALUES('B') DECLARE @Count int SET @Count= 1 WHILE (@Count < 16000) BEGIN INSERT INTO [test].[dbo].[TBLB]([DATA]) VALUES('C') SET @Count = @Count + 1 END BEGIN TRAN UPDATE [test].[dbo].[TBLB] WITH (UPDLOCK) SET [DATA]='TEST' WHERE [DATA] ='B' --ROLLBACK TRAN [CODE]--- [CODE]--- CREATE TABLE [TBLC] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [DATA] [char] (10) COLLATE Japanese_CI_AS NULL , CONSTRAINT [PK_TBLC] PRIMARY KEY CLUSTERED ( [ID] ) ON [PRIMARY] ) ON [PRIMARY] GO INSERT INTO [test].[dbo].[TBLC]([DATA]) VALUES('A') INSERT INTO [test].[dbo].[TBLC]([DATA]) VALUES('B') DECLARE @Count int SET @Count= 1 WHILE (@Count < 16000) BEGIN INSERT INTO [test].[dbo].[TBLC]([DATA]) VALUES('C') SET @Count = @Count + 1 END BEGIN TRAN UPDATE [test].[dbo].[TBLC] SET [DATA]='TEST' WHERE [DATA] ='B' --ROLLBACK TRAN [CODE]--- ---------- TimberLandChapel http://blogs.timberlandchapel.com/blogs/timberlandchapel/ [ メッセージ編集済み 編集者: TLC 編集日時 2006-01-28 00:05 ] [ メッセージ編集済み 編集者: TLC 編集日時 2006-01-28 00:08 ] | ||||||||
|
投稿日時: 2006-01-28 01:52
実際にテーブルが更新されれば排他ロック(XLOCK)に変換されるからねえ。更新ロック(UPDLOCK)なんて指定する意味はないと思うのだけど・・・。
その人が、更新ロック(UPDLOCK)という名称から勘違いして update 文で使うものだと思い込んでるだけじゃないかな。 | ||||||||
|
投稿日時: 2006-01-30 11:31
TLCさん、未記入さん返信ありがとうございます。
そうですね。私もその考えです。 結局プライマリーキー列を指定したUpdate文では行ロックがかかるけれど、 別の列を指定したUpdate文では、テーブルロックになるようでした。 それは、UPDLOCKを指定しても、指定しなくてもなんら変わりはなかったです。 ですので、意味がないかな・・・と。 TLCさんのコードを試してテーブルのロック状態を確認はしました。 確かに、共有ロックになっていたり、排他ロックになっていたりの違いは ありましたが、デッドロックを考えるのであれば、 Update文ではプライマリーキーを条件指定して行ロックにしておく事が必要。 UPDLOCKを指定してUpdateを作成しても意味はないと思うのですがいかがでしょうか? | ||||||||
|
投稿日時: 2006-01-30 22:42
お疲れ様です。 あくまで違いがわかるのはどういった状況か? というのを示すだけのコードでした。 おっしゃるとおり, UPDLOCK を Update で使用する必要はありません。 むしろ,不要なはずのインテントロックを取得する場合がありますので, 不必要なところにまで気を使わなければならなくなってしまいます。 ---------- TimberLandChapel http://blogs.timberlandchapel.com/blogs/timberlandchapel/ | ||||||||
|
投稿日時: 2006-01-30 22:57
kwsk。結局、ページとテーブルにインテント排他(IX)がかかると思いますけど、それとは違うということでしょうか? | ||||||||
|
投稿日時: 2006-01-31 00:05
お疲れ様です。 通常の更新の際のインテントとは別に IU ロックまたは U ロックそのものが大量に取得される場合があります。 テーブルの大きさとページの利用の状況によってしまいますが。 いずれにせよ,不要ということで。 ----------- TimberLandChapel http://blogs.timberlandchapel.com/blogs/timberlandchapel/ | ||||||||
|
投稿日時: 2006-01-31 09:03
返信ありがとうございます。
良かった。これで心おきなくUPDLOCKをはずす事ができます。 ありがとうございました。 |
1