Tôi cần phải chọn đầu tiên (giả sử) 10.000 hàng trong cơ sở dữ liệu và trả lại chúng. Có thể có nhiều khách hàng thực hiện thao tác này cùng một lúc. Tôi đã đưa ra truy vấn này:Bản cập nhật có hoạt động nguyên tử được chọn lồng nhau không?
update v set v.batch_Id = :batchId
from tblRedir v
inner join (
select top 10000 id
from tblRedir
where batch_Id is null
order by Date asc
) v2 on v.id=v2.id
Đây là một hoạt động bao gồm cập nhật và chọn lồng nhau. Cả hai truy vấn đều hoạt động trên cùng một bảng (tblRedir). Ý tưởng là các hàng được đầu tiên đánh dấu bằng một Id lô độc đáo và sau đó trở về qua
select * from tblRedir where batch_id = :batchId
(các Id lô là một định danh duy nhất (ví dụ như dấu thời gian hoặc guid) cho mỗi lần cập nhật này)
Câu hỏi của tôi:
Tôi nghĩ rằng hoạt động cập nhật với lựa chọn lồng nhau là nguyên tử - điều đó có nghĩa là mọi khách hàng đều nhận được bộ dữ liệu riêng của mình là duy nhất (không có khách hàng nào khác nhận được tập con dữ liệu của anh ấy).
Tuy nhiên có vẻ rằng tôi sai - trong một số trường hợp có những khách hàng mà không nhận được dữ liệu, vì lẽ họ lần đầu tiên cả thực hiện lựa chọn và sau đó cả hai thực hiện cập nhật (vì vậy khách hàng đầu tiên không có đánh dấu hàng).
Hoạt động này có phải là nguyên tử hay không?
tôi làm việc với SQL Server 2005. Các truy vấn được chạy qua NHibernate như thế này
session.CreateSQLQuery('update....')
Thx cho câu trả lời của bạn. Tôi đã thử các thay thế ('với q là ...') và có vẻ như là READPAST không thể được sử dụng với HOLDLOCK. Tôi đã thử mức cách ly 'đọc cam kết', 'đọc lặp lại' và trong cả hai trường hợp máy chủ sql phàn nàn 'Bạn chỉ có thể chỉ định khóa READPAST trong các cấp độ READ READITTED hoặc REPEATABLE READ. Truy vấn có đúng ngay cả khi không có HOLDLOCK không? – stej
'@ stej': Tôi không nghĩ rằng' SQL Server' sẽ chia 'SELECT' và' UPDATE' phần trong trường hợp này, vì vậy có, các khóa cập nhật sẽ được đặt tự động. Bạn có thể xóa 'HOLDLOCK'. – Quassnoi
Cảm ơn bạn. Tôi đã thử nó, có vẻ như nó hoạt động. Trong một số trường hợp có nhiều bế tắc, nhưng đột nhiên không có gì - thật khó để tái tạo nó.Trong trường hợp tôi sẽ có thể mô tả nó bằng cách nào đó, tôi sẽ gửi một câu hỏi mới. – stej