2013-08-04 43 views
6

Tôi cập nhật một hàng của bảng, sử dụng WITH (ROWLOCK), nhưng bằng cách thực thi "sp_lock", tôi có thể thấy toàn bộ bảng là bị khóa. Vì vậy, trước khi giao dịch được thực hiện, các giao dịch khác không thể cập nhật các hàng khác của bảng. tại sao "WITH (ROWLOCK)" không có hiệu lực?tại sao toàn bộ bảng bị khóa trong khi "with (rowlock)" được sử dụng trong câu lệnh cập nhật

Tôi đang sử dụng các truy vấn dưới đây với cột chèo:

DELETE FROM DefDatabaseSession WITH (ROWLOCK) WHERE ProcessName='test'; 

trong cùng một thời gian từ bất kỳ giao dịch khác đang chạy các hoạt động xóa tương tự cho hàng sự khác biệt trong cùng một bảng Tôi nhận được ngoại lệ

[ Trình điều khiển JDBC SQLServer] [SQLServer] Thời gian yêu cầu khóa vượt quá thời gian .; ngoại lệ lồng nhau là java.sql.SQLException: [newscale] [SQLServer JDBC Driver] [SQLServer] Thời gian yêu cầu khóa vượt quá thời gian: com.newscale.bfw.udkernel.kernel.UdKernelException: udconfig.defdbsession.delete; SQLException chưa được phân loại cho SQL [DELETE FROM DefDatabaseSession WHERE ProcessName =?]; Trạng thái SQL [HY000]; mã lỗi [1222]; [newscale] [SQLServer JDBC Driver] [SQLServer] Thời gian yêu cầu khóa vượt quá thời gian .; ngoại lệ lồng nhau là java.sql.SQLException: [newscale] [SQLServer JDBC Driver] [SQLServer] Thời gian yêu cầu khóa vượt quá thời gian.

Trả lời

2

Lý do ở đây là trình tối ưu hóa bỏ qua gợi ý khóa hàng [WITH (ROWLOCK) cung cấp gợi ý truy vấn cho trình tối ưu hóa]. Điều này sẽ xảy ra trong các tình huống mà bạn đang đánh một số lượng lớn các hàng, trong các trình tối ưu hóa kịch bản như vậy, hãy tìm khả năng quét heap trên bàn của bạn và do đó có được khóa bảng.

Đối với một cuộc thảo luận chi tiết bạn có thể vào link này: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/60238304-04e8-4f98-84d1-3ddf1ed786a9/why-the-entire-table-is-locked-while-with-rowlock-is-used-in-a-update-statement

0

Tôi đoán là bạn không có một chỉ mục trên ProcessName, vì vậy truy vấn phải làm một bảng quét toàn bộ, do đó tất cả các hàng được đọc (và có thể là ứng cử viên để xóa), do đó, nó hiệu quả hơn để khóa toàn bộ bảng hơn là khóa mọi hàng.

Cố gắng xác định một chỉ số:

CREATE INDEX DefDatabaseSession_ProcessName ON DefDatabaseSession(ProcessName); 

Bạn có thể tìm ra các kế hoạch truy vấn bằng cách thực hiện một giải thích:

EXPLAIN DELETE FROM DefDatabaseSession WITH (ROWLOCK) WHERE ProcessName='test'; 
+1

'EXPLAIN' không tồn tại trên SQL Server. Sử dụng nút "bao gồm kế hoạch thực hiện thực tế" để có kế hoạch. – Alejandro

+0

tôi có chỉ mục cho cột ProcessName. – vani

+0

nhưng tôi cần khóa hàng chỉ .. bởi vì có những hàng khác xóa sẽ xảy ra cùng một lúc bởi một số chủ đề khác .. vì vậy tôi cần phải loack duy nhất của tôi không phải là tất cả .. tôi không thể sử dụng bảng khóa – vani

Các vấn đề liên quan