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

Làm thế nào để thoát khỏi bế tắc trong ứng dụng SQL Server 2005 và C #?

Tôi không thể thấy bất kỳ phạm vi giao dịch rõ ràng nào trong mã của bạn, vì vậy tôi không biết khóa nào đã được đặt khi bạn thực hiện cập nhật; cũng không rõ bạn đang sử dụng mức cô lập nào. Nhưng tình huống phổ biến nhất trong loại tình huống này là trước đó trong cùng một giao dịch, bạn đã đưa ra một lựa chọn (khóa đọc) trên cùng các hàng mà bạn đang cố gắng cập nhật sau đó. Điều này sẽ gây ra leo thang khóa và có thể dẫn đến bế tắc nếu hai giao dịch đang cố gắng thực hiện cùng một điều:

  1. Giao dịch A:chọn với khóa đọc
  2. Giao dịch B:chọn với khóa đọc
  3. Giao dịch A:cập nhật - muốn chuyển khóa đọc của nó thành khóa awrite, nhưng phải đợi giao dịch B giải phóng khóa đọc của nó
  4. Giao dịch B:cập nhật - muốn chuyển khóa đọc của nó thành khóa awrite, nhưng phải đợi giao dịch A giải phóng khóa đọc của nó.

Chơi lô tô! bế tắc vì cả A và B đang chờ nhau giải phóng các khóa đọc hiện có của họ trước khi họ có thể cập nhật.

Để ngăn chặn điều này, bạn cần một gợi ý về khóa cập nhật trong lựa chọn của mình, ví dụ:

select * from table with (updlock) where blah blah

Điều này sẽ đảm bảo lựa chọn của bạn sử dụng khóa ghi thay vì khóa đọc, điều này sẽ ngăn khóa leo thang giữa các giao dịch đồng thời.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bật SQL Server 'xp_cmdshell'

  2. ISDATE () Ví dụ trong SQL Server

  3. Cách lưu trữ bản ghi lịch sử trong bảng lịch sử trong SQL Server

  4. Làm cách nào để tăng tốc DbSet.Add ()?

  5. Khóa chính tự động tăng dần trong SQL Server Management Studio 2012