Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да хвана SqlException, причинена от блокиране?

Специфичният код за грешка на Microsft SQL Server за блокиране е 1205, така че ще трябва да обработите SqlException и да проверите за това. Така, напр. ако за всички останали типове SqlException искате балонът да показва изключението нагоре:

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

Или като използвате филтриране по изключения, налично в C# 6

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

Удобно нещо, което можете да направите, за да намерите действителния SQL код за грешка за дадено съобщение, е да погледнете в sys.messages в SQL Server.

напр.

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

Има пълен пример тук в MSDN за това как да внедрите логика за повторен опит за блокиране само в 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. Как мога да реша Или параметърът @objname е двусмислен, или заявеният @objtype (COLUMN) е грешен.?

  2. Възникна сериозна грешка в текущата команда при опит за вмъкване от свързан сървър

  3. Как да напиша име на колона с точка (.) в клаузата SELECT?

  4. Възможно ли е принудително заключване на ниво ред в SQL Server?

  5. Размерът на регистрационния файл влияе ли на производителността на базата данни? Как да свия лог файла?