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

Làm thế nào để bắt SqlException gây ra bởi deadlock?

Mã lỗi Microsft SQL Server cụ thể cho một bế tắc là 1205, vì vậy bạn cần phải xử lý SqlException và kiểm tra điều đó. Vì vậy, v.d. nếu đối với tất cả các loại SqlException khác, bạn muốn bong bóng có ngoại lệ:

catch (SqlException ex)
{
    if (ex.Number == 1205)
    {
        // Deadlock 
    }
    else
        throw;
}

Hoặc, sử dụng tính năng lọc ngoại lệ có sẵn trong C # 6

catch (SqlException ex) when (ex.Number == 1205)
{
    // Deadlock 
}

Một điều hữu ích cần làm để tìm mã lỗi SQL thực tế cho một thông báo nhất định là tìm trong sys.messages trong SQL Server.

ví dụ:

SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033

Một cách thay thế để xử lý các deadlock (từ SQL Server 2005 trở lên) là thực hiện nó trong một quy trình được lưu trữ bằng cách sử dụng hỗ trợ TRY ... CATCH:

BEGIN TRY
    -- some sql statements
END TRY
BEGIN CATCH
    IF (ERROR_NUMBER() = 1205)
        -- is a deadlock
    ELSE
        -- is not a deadlock
END CATCH

Có một ví dụ đầy đủ tại đây trong MSDN về cách triển khai logic thử lại deadlock hoàn toàn trong SQL.



  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ác loại con trỏ máy chủ SQL - Con trỏ động | Hướng dẫn sử dụng SQL Server / TSQL

  2. Hạn chế kết nối SQL Server đối với một địa chỉ IP cụ thể

  3. Triển khai phân trang bằng cách sử dụng OFFSET FETCH NEXT trong SQL Server

  4. Sự khác biệt giữa là gì; và ĐI trong T-SQL?

  5. 2 cách để xem liệu các tính năng không dùng nữa có còn được sử dụng trong phiên bản máy chủ SQL hay không