ในขณะที่ค้นคว้าการใช้Table Hintsฉันเจอคำถามสองข้อนี้:
คำตอบของทั้งสองคำถามบอกว่าเมื่อใช้(UPDLOCK, HOLDLOCK)
กระบวนการอื่น ๆ จะไม่สามารถอ่านข้อมูลบนตารางนั้นได้ แต่ฉันไม่เห็นสิ่งนี้ ในการทดสอบฉันสร้างตารางและเริ่มหน้าต่าง SSMS สองหน้าต่าง จากหน้าต่างแรกฉันรันธุรกรรมที่เลือกจากตารางโดยใช้คำแนะนำตารางต่างๆ ในขณะที่ธุรกรรมกำลังทำงานอยู่จากหน้าต่างที่สองฉันเรียกใช้คำสั่งต่างๆเพื่อดูว่ารายการใดจะถูกบล็อก
ตารางทดสอบ:
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 Window 1:
BEGIN TRANSACTION
SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'
COMMIT TRANSACTION
จาก SSMS Window 2 (ทำงานอย่างใดอย่างหนึ่งต่อไปนี้):
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'
ผลกระทบของคำแนะนำตารางที่แตกต่างกันในคำสั่งที่เรียกใช้ในหน้าต่าง 2:
(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
ฉันเข้าใจคำตอบที่ให้ไว้ในคำถามเหล่านั้นเข้าใจผิดหรือทำผิดในการทดสอบหรือไม่? ถ้าไม่คุณจะใช้(UPDLOCK, HOLDLOCK)
กับ(HOLDLOCK)
คนเดียวทำไม?
คำอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่ฉันพยายามทำให้สำเร็จ:
ฉันต้องการเลือกแถวจากตารางและป้องกันไม่ให้ข้อมูลในตารางนั้นถูกแก้ไขในขณะที่ฉันกำลังประมวลผล ฉันไม่ได้แก้ไขข้อมูลนั้นและต้องการอนุญาตให้มีการอ่านเกิดขึ้น
คำตอบนี้บอกอย่างชัดเจนว่า(UPDLOCK, HOLDLOCK)
จะบล็อกอ่าน (ไม่ใช่สิ่งที่ฉันต้องการ) ความคิดเห็นเกี่ยวกับคำตอบนี้บ่งบอกว่าเป็นการHOLDLOCK
ป้องกันการอ่าน เพื่อพยายามทำความเข้าใจผลของคำแนะนำตารางให้ดีขึ้นและดูว่าUPDLOCK
คนเดียวจะทำในสิ่งที่ฉันต้องการได้หรือไม่ฉันได้ทำการทดลองข้างต้นและได้ผลลัพธ์ที่ขัดแย้งกับคำตอบเหล่านั้น
ตอนนี้ฉันเชื่อว่านั่น(HOLDLOCK)
คือสิ่งที่ฉันควรใช้ แต่ฉันกังวลว่าฉันอาจทำผิดพลาดหรือมองข้ามบางสิ่งที่จะกลับมากัดฉันในอนาคตดังนั้นคำถามนี้