Chúng tôi đã tìm thấy một số hàng trong DB của chúng tôi vi phạm ràng buộc hoạt động. Sao có thể như thế được?
Ràng buộc đang hoạt động, vì chúng ta không thể thêm một hàng thủ công bỏ qua ràng buộc này. Tuy nhiên, khi chúng tôi chạy CHECKCONSTRAINTS(Files), chúng tôi thấy rằng nó đã bị bỏ qua trong một số ít lần trong quá trình chạy thử của chúng tôi. Tất cả các hàng trong câu hỏi được tạo ra trong vòng nửa giây của nhau, cho thấy một số điều kiện chủng tộc.
Đây là ràng buộc được áp dụng cho bảng. Quy tắc này có nghĩa là để đảm bảo tính duy nhất của tên trong thư mục cha đã cho:
ALTER TABLE Files ADD CONSTRAINT UniqueNameInParentFolder CHECK
CheckUniqueNameInFolder(ParentFoldersID, Name) = 1;
Ràng buộc này gọi một hàm trông như thế này:
-- first check for the new name in the Folders table
IF ((SELECT COUNT(*) FROM Folders
WHERE ParentFoldersID = @FoldersID AND Name = @Name) = 0)
BEGIN
-- then check for it in the Files table
IF ((SELECT COUNT(*) FROM Files
WHERE ParentFoldersID = @FoldersID AND Name = @Name) <= 1)
RETURN 1
END
RETURN 0
Các hàng riêng lẻ được thêm vào bên trong các giao dịch, vì vậy tôi rất khó hiểu làm thế nào các hàng trùng lặp đang lén lút vượt qua ràng buộc này.
Foldersđang nhìn thấy một số lượng vi phạm tương tự ở đó là tốt. Chúng tôi hiện đang sử dụngREAD_COMMITTED_SNAPSHOT.