Tablo İpuçlarının kullanımını araştırırken şu iki soruyla karşılaştım:
Her iki sorunun cevabı (UPDLOCK, HOLDLOCK)
, diğer işlemlerin bu tablodaki verileri okuyamayacağını söylüyor, ancak ben bunu görmedim. Test etmek için bir tablo oluşturdum ve iki SSMS penceresi başlattım. İlk pencereden çeşitli tablo ipuçlarını kullanarak tablodan seçilen bir işlemi çalıştırdım. İşlem devam ederken, ikinci pencereden hangisinin engelleneceğini görmek için çeşitli ifadeler çalıştırdım.
Test tablosu:
CREATE TABLE [dbo].[Test](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Value] [nvarchar](50) NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
SSMS Penceresi 1'den:
BEGIN TRANSACTION
SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'
COMMIT TRANSACTION
SSMS Penceresinden 2 (aşağıdakilerden birini çalıştırdı):
SELECT * FROM dbo.Test
INSERT dbo.Test(Value) VALUES ('bar')
UPDATE dbo.Test SET Value = 'baz' WHERE Value = 'bar'
DELETE dbo.Test WHERE Value= 'baz'
Farklı tablo ipuçlarının Pencere 2'de çalıştırılan ifadeler üzerindeki etkisi:
(UPDLOCK) (HOLDLOCK) (UPDLOCK, HOLDLOCK) (TABLOCKX)
---------------------------------------------------------------------------
SELECT not blocked not blocked not blocked blocked
INSERT not blocked blocked blocked blocked
UPDATE blocked blocked blocked blocked
DELETE blocked blocked blocked blocked
Bu sorularda verilen cevapları yanlış mı anladım yoksa testlerimde bir hata mı yaptım? Değilse, neden kullanmak istiyorsunuz (UPDLOCK, HOLDLOCK)
vs (HOLDLOCK)
yalnız?
Neyi başarmaya çalıştığımla ilgili daha fazla açıklama:
Bir tablodan satır seçmek ve bu tablodaki verilerin ben onu işlerken değiştirilmesini önlemek istiyorum. Bu verileri değiştirmiyorum ve okumaların gerçekleşmesine izin vermek istiyorum.
Bu cevap açıkça (UPDLOCK, HOLDLOCK)
okumaları engelleyeceğini söylüyor (istediğimi değil). Bu yanıta ilişkin yorumlar, HOLDLOCK
okumayı engelleyen şeyin bu olduğunu ima etmektedir . Tablo ipuçlarının etkilerini denemek ve daha iyi anlamak ve UPDLOCK
tek başına istediğimi yapıp yapamayacağını görmek için yukarıdaki deneyi yaptım ve bu cevaplarla çelişen sonuçlar aldım.
Şu anda, (HOLDLOCK)
kullanmam gereken şeyin bu olduğuna inanıyorum , ancak bir hata yapmış olabileceğimden veya gelecekte beni ısırmak için geri gelecek bir şeyi, dolayısıyla bu soruyu gözden kaçırmış olabileceğimden endişe ediyorum.