Trong khi nghiên cứu việc sử dụng Bảng Gợi ý , tôi gặp hai câu hỏi sau:
Câu trả lời cho cả hai câu hỏi nói rằng khi sử dụng (UPDLOCK, HOLDLOCK)
, các quy trình khác sẽ không thể đọc dữ liệu trên bảng đó, nhưng tôi không thấy điều này. Để kiểm tra, tôi đã tạo một bảng và khởi động hai cửa sổ SSMS. Từ cửa sổ đầu tiên, tôi đã chạy một giao dịch được chọn từ bảng bằng cách sử dụng các gợi ý bảng khác nhau. Trong khi giao dịch đang chạy, từ cửa sổ thứ hai, tôi chạy các câu lệnh khác nhau để xem cái nào sẽ bị chặn.
Bảng kiểm tra:
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]
Từ SSMS Window 1:
BEGIN TRANSACTION
SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'
COMMIT TRANSACTION
Từ SSMS Window 2 (chạy một trong những thao tác sau):
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'
Ảnh hưởng của các gợi ý bảng khác nhau đối với các câu lệnh chạy trong Window 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
Tôi đã hiểu sai câu trả lời được đưa ra trong những câu hỏi đó hoặc mắc lỗi trong bài kiểm tra của mình? Nếu không, tại sao bạn sẽ sử dụng (UPDLOCK, HOLDLOCK)
so với (HOLDLOCK)
một mình?
Giải thích thêm về những gì tôi đang cố gắng hoàn thành:
Tôi muốn chọn các hàng từ một bảng và ngăn không cho dữ liệu trong bảng đó bị sửa đổi khi đang xử lý. Tôi không sửa đổi dữ liệu đó và muốn cho phép đọc xảy ra.
Câu trả lời này nói rõ rằng điều đó (UPDLOCK, HOLDLOCK)
sẽ chặn lượt đọc (không phải những gì tôi muốn). Các nhận xét về câu trả lời này ngụ ý rằng nó HOLDLOCK
ngăn cản việc đọc. Để thử và hiểu rõ hơn về tác dụng của các gợi ý trong bảng và xem liệu UPDLOCK
một mình có làm được những gì tôi muốn hay không, tôi đã thực hiện thí nghiệm trên và nhận được kết quả trái ngược với những câu trả lời đó.
Hiện tại, tôi tin rằng đó (HOLDLOCK)
là những gì tôi nên sử dụng, nhưng tôi lo ngại rằng tôi có thể đã mắc sai lầm hoặc bỏ qua thứ gì đó sẽ quay lại cắn tôi trong tương lai, do đó, câu hỏi này.