Tôi đang chạy một thủ tục lưu trữ mà chọn giá trị bảng temp của tôi và chèn chúng vào cơ sở dữ liệu như vậy:INSERT INTO .. CHỌN .. độc đáo hạn chế vi phạm
INSERT INTO emails (EmailAddress) (
SELECT
DISTINCT eit.EmailAddress
FROM #EmailInfoTemp eit
LEFT JOIN emails ea
ON eit.EmailAddress = ea.EmailAddress
WHERE ea.EmailAddressID IS NULL )
Mở trường hợp hiếm hoi (~ một lần mỗi vài số giờ trên một máy chủ xử lý hàng nghìn yêu cầu một phút), sau đó tôi nhận được một lỗi ràng buộc duy nhất "Vi phạm ràng buộc KEY UNIQUE" .. trên một chỉ mục trên cột EmailAddress.
Tôi có thể xác nhận rằng tôi không chuyển giá trị trùng lặp. Ngay cả khi tôi đã, nó sẽ bị bắt bởi DISTINCT.
server -SQL 2008 proc -Stored + không sử dụng các giao dịch + JDBC CallableStatement
Nó có thể xảy ra rằng giữa SELECT và INSERT sau đó, đã có một cuộc gọi đến cùng proc lưu trữ/khác nhau mà hoàn thành một INSERT với dữ liệu tương tự? Nếu vậy, cách tốt nhất để ngăn chặn điều đó là gì?
Một số ý tưởng: Chúng tôi có nhiều trường hợp trùng lặp "khách hàng" giao tiếp với SQL Server này một lần trong sản xuất, vì vậy phản ứng đầu tiên của tôi là vấn đề tương tranh, nhưng dường như tôi không thể tự sao chép nó. Đó là dự đoán tốt nhất tôi có, nhưng nó không còn ở đâu cả. Điều này không xảy ra trên môi trường dàn dựng của chúng tôi khi tải không đáng kể so với môi trường sản xuất. Đó là lý do chính tôi bắt đầu xem xét các vấn đề tương tranh.
Giá trị NULL trong EmailAddress ở cả hai bên có thể vi phạm ràng buộc khóa duy nhất. Nếu cột này là nullable bạn có thể viết lại chèn như 'không tồn tại'. –
Điểm tốt. Tôi kiểm tra với null trong mã, nhưng tôi cho rằng tôi có thể kiểm tra lại nó trong sql. –