jak wykryć limit czasu serwera sql from.NET aplikacja bez użycia wyjątku catch
W mojej obecnej aplikacji wykonuję aktualizację, wywołując polecenie T-SQL Update. Problem polega na tym, że ten sam rekord jest zablokowany przez innych użytkowników w tym czasie.
W aplikacji. NET aplikacja będzie czekać do limitu czasu SQL Server, a następnie dorzuci limit czasu SqlException.
Czy można najpierw sprawdzić, czy dany rekord jest zablokowany przez inny proces, a nie wyłapać wyjątek ?
2 answers
Nie, Nie bardzo.
Standardowym sposobem jest użycie try/catch
i obsłużenie SqlException
numeru 1205
(ofiara deadlock) i ponów zapytanie:
try
{
// do stuff...
}
catch (SqlException sqlEx)
{
switch (sqlEx.Number)
{
case -2: // Client Timeout
case 701: // Out of Memory
case 1204: // Lock Issue
case 1205: // >>> Deadlock Victim
// handle deadlock
break;
case 1222: // Lock Request Timeout
case 2627: // Primary Key Violation
case 8645: // Timeout waiting for memory resource
case 8651: // Low memory condition
...
}
}
[Uwaga: wyrażenia break nie są dodawane dla zwartości
Zauważ również , wiele problemów z blokowaniem można wyeliminować, zapewniając odpowiednie indeksy krycia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 13:24:36
Możesz użyć osobnego połączenia z bardzo krótkim czasem, aby spróbować zablokować rekord poprzez aktualizację jakiegoś pola, ale to nadal nie da ci 100% niezawodności.
Jeśli naprawdę masz sytuację z wieloma użytkownikami edytującymi te same rekordy, powinieneś przyjrzeć się optymistycznym technikom blokowania.
Upewnij się również, że nie zezwalasz użytkownikom na blokowanie rekordów - użyj trybu rozłączonego dla wszelkich aktualizacji. Innymi słowy, blokowanie nastąpi tylko przez krótki czas update (
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 13:28:06