Ai đó có thể giúp tôi bế tắc trong SQL Server 2005 không?Bối cảnh SQL Server 2005 bế tắc với chỉ số không độc quyền
Để kiểm tra đơn giản, tôi có một bảng "Sách" có khóa chính (id) và tên cột. Chỉ mục mặc định của khóa chính này là nonclustered.
Bế tắc xảy ra khi hai phiên chạy cùng một lúc. Màn hình hoạt động cho thấy phiên đầu tiên "// bước 1" khóa hàng (thoát khóa) bằng khóa X. Phiên thứ hai giữ hàng U khóa và khóa U khóa. Hình ảnh bế tắc hiển thị "// step2" của phiên đầu tiên yêu cầu khóa U chính.
Nếu chỉ mục là được nhóm, không có bế tắc trong trường hợp này. "// step 1" sẽ giữ cho hàng và khóa phím cùng một lúc, do đó, không có vấn đề gì. Tôi có thể hiểu việc khóa một hàng cũng sẽ khóa chỉ mục vì nút lá của chỉ số nhóm là dữ liệu hàng.
Nhưng tại sao nonclustered chỉ mục theo cách này? Nếu phiên thứ hai giữ khóa U khóa, tại sao "bước 1" của phiên đầu tiên không giữ khóa này vì chúng giống như câu lệnh cập nhật.
--// first session
BEGIN TRAN
update Book set name = name where id = 1 //step 1
WaitFor Delay '00:00:20'
update Book set name = 'trans' where id = 1 //step2
COMMIT
--// second session
BEGIN TRAN
--// this statement will keep both RID(U lock) and KEY(U lock) if first session did not use HOLDLOCK
update Book set name = name where id = 1
COMMIT
bạn có khóa cụm trên bảng Sách mẫu không? Tôi không nghĩ rằng đó là câu hỏi liệu PK của bạn có được phân nhóm hay không - tôi nghĩ nó còn quan trọng hơn nếu bạn thực sự có một Clustered Key (và do đó một bảng được nhóm), hoặc cho dù bạn đang xử lý một heap (không có chỉ mục clustered)) –
Bạn có thể thêm đầu ra liên quan của 'exec sp_lock' trong khi nó đang bế tắc không? – Andomar
Từ sqlprofiler, hình ảnh bế tắc hiển thị "// step2" của phiên đầu tiên yêu cầu khóa U chính, nhưng nó được tổ chức bởi seesion2. –