- PR -

With (UpdLock) の指定について

1
投稿者投稿内容
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 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指定が
ついていました。
その為、どのような動作になるのかを調べなくてはいけなくなりまして・・・・

お分かりの方教えて下さい。お願いします。
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2006-01-28 00:05
引用:

ケイさんの書き込み (2006-01-24 15:40) より:

Update Tes with (UPDLOCK) set Name = 'テスト' Where ID = 1

というUpdate文と

Update Tes set Name = 'テスト' Where ID = 1

のUpdate 文の違いが分かりません。




お疲れ様です。

とりあえず,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 ]
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2006-01-28 01:52
実際にテーブルが更新されれば排他ロック(XLOCK)に変換されるからねえ。更新ロック(UPDLOCK)なんて指定する意味はないと思うのだけど・・・。

その人が、更新ロック(UPDLOCK)という名称から勘違いして update 文で使うものだと思い込んでるだけじゃないかな。
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2006-01-30 11:31
TLCさん、未記入さん返信ありがとうございます。

引用:

未記入さんの書き込み (2006-01-28 01:52) より:
実際にテーブルが更新されれば排他ロック(XLOCK)に変換されるからねえ。更新ロック(UPDLOCK)なんて指定する意味はないと思うのだけど・・・。



そうですね。私もその考えです。
結局プライマリーキー列を指定したUpdate文では行ロックがかかるけれど、
別の列を指定したUpdate文では、テーブルロックになるようでした。
それは、UPDLOCKを指定しても、指定しなくてもなんら変わりはなかったです。
ですので、意味がないかな・・・と。

TLCさんのコードを試してテーブルのロック状態を確認はしました。
確かに、共有ロックになっていたり、排他ロックになっていたりの違いは
ありましたが、デッドロックを考えるのであれば、
Update文ではプライマリーキーを条件指定して行ロックにしておく事が必要。

UPDLOCKを指定してUpdateを作成しても意味はないと思うのですがいかがでしょうか?

TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2006-01-30 22:42
引用:


TLCさんのコードを試してテーブルのロック状態を確認はしました。
確かに、共有ロックになっていたり、排他ロックになっていたりの違いは
ありましたが、デッドロックを考えるのであれば、
Update文ではプライマリーキーを条件指定して行ロックにしておく事が必要。

UPDLOCKを指定してUpdateを作成しても意味はないと思うのですがいかがでしょうか?




お疲れ様です。
あくまで違いがわかるのはどういった状況か? というのを示すだけのコードでした。

おっしゃるとおり,
UPDLOCK を Update で使用する必要はありません。

むしろ,不要なはずのインテントロックを取得する場合がありますので,
不必要なところにまで気を使わなければならなくなってしまいます。

----------
TimberLandChapel
http://blogs.timberlandchapel.com/blogs/timberlandchapel/
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2006-01-30 22:57
引用:
むしろ,不要なはずのインテントロックを取得する場合がありますので,


kwsk。結局、ページとテーブルにインテント排他(IX)がかかると思いますけど、それとは違うということでしょうか?
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2006-01-31 00:05
引用:

未記入さんの書き込み (2006-01-30 22:57) より:
引用:
むしろ,不要なはずのインテントロックを取得する場合がありますので,


kwsk。結局、ページとテーブルにインテント排他(IX)がかかると思いますけど、それとは違うということでしょうか?



お疲れ様です。
通常の更新の際のインテントとは別に
IU ロックまたは U ロックそのものが大量に取得される場合があります。
テーブルの大きさとページの利用の状況によってしまいますが。

いずれにせよ,不要ということで。

-----------
TimberLandChapel
http://blogs.timberlandchapel.com/blogs/timberlandchapel/
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2006-01-31 09:03
返信ありがとうございます。

引用:

TLCさんの書き込み (2006-01-31 00:05) より:

通常の更新の際のインテントとは別に
IU ロックまたは U ロックそのものが大量に取得される場合があります。
テーブルの大きさとページの利用の状況によってしまいますが。

いずれにせよ,不要ということで。



良かった。これで心おきなくUPDLOCKをはずす事ができます。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)