Hai câu lệnh của bạn có được các khóa hàng theo thứ tự khác nhau. Đó là một trường hợp kinh điển cho các trường hợp bế tắc. Bạn có thể khắc phục điều này bằng cách đảm bảo rằng thứ tự các khóa được thực hiện luôn theo một số thứ tự toàn cầu (ví dụ:sắp xếp theo ID). Bạn có thể nên kết hợp hai UPDATE
các câu lệnh thành một và sắp xếp danh sách các ID trên máy khách trước khi gửi nó đến SQL Server. Đối với nhiều UPDATE
điển hình kế hoạch này thực sự hoạt động tốt (mặc dù không được đảm bảo).
Hoặc, bạn thêm logic thử lại trong trường hợp bạn phát hiện thấy bế tắc (SqlException.Number == 1205
). Điều này thanh lịch hơn vì nó không yêu cầu thay đổi mã sâu hơn. Tuy nhiên, deadlock có ý nghĩa về hiệu suất, vì vậy chỉ làm điều này đối với tỷ lệ deadlock thấp.
Nếu quá trình xử lý song song của bạn tạo ra nhiều bản cập nhật, bạn có thể INSERT
tất cả các cập nhật đó vào một bảng tạm thời (có thể được thực hiện đồng thời) và khi hoàn tất, bạn thực hiện một UPDATE
lớn sao chép tất cả các bản ghi cập nhật riêng lẻ vào bảng chính. Bạn chỉ cần thay đổi nguồn tham gia trong các truy vấn mẫu của mình.