Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Mã đơn giản này tạo ra bế tắc. Chương trình ví dụ đơn giản bao gồm

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách khắc phục “Không thành công câu lệnh ALTER TABLE SWITCH” Msg 4982 (SQL Server)

  2. Sử dụng SQL Merge hoặc UPDATE / INSERT

  3. Công dụng của dấu ngoặc vuông [] trong câu lệnh sql là gì?

  4. Hàm tính giá trị trung bình trong SQL Server

  5. T-SQL:So sánh hai bảng - Bản ghi không tồn tại trong bảng thứ hai