sql >> データベース >  >> RDS >> Sqlserver

デッドロックによって引き起こされたSqlExceptionをキャッチする方法は?

    デッドロックのMicrosftSQLServer固有のエラーコードは1205であるため、SqlExceptionを処理して確認する必要があります。だから、例えば他のすべてのタイプのSqlExceptionについて、バブルで例外を発生させたい場合:

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

    または、C#6で利用可能な例外フィルタリングを使用する

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

    特定のメッセージの実際のSQLエラーコードを見つけるために行うと便利なことは、SQLServerのsys.messagesを調べることです。

    例:

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

    (SQL Server 2005以降の)デッドロックを処理する別の方法は、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
    

    ここ の完全な例があります。 純粋にSQL内でデッドロック再試行ロジックを実装する方法についてはMSDNで。



    1. ノードMysql非同期複数クエリ

    2. エラー1067(42000):「end_time」のデフォルト値が無効です

    3. Railsの月と年の両方でレコードをグループ化する

    4. PostgreSQLCASE...複数の条件で終了