Questo errore si verifica quando Microsoft SQL Server individua un deadlock. Un deadlock si verifica quando due o più processi provano ad accedere a una risorsa bloccata da un altro processo. Poiché ogni processo richiede un'altra risorsa, nessun processo può essere completato. Quando viene individuato un deadlock, SQL Server esegue automaticamente il rollback del comando a cui è associata la durata di elaborazione minore e restituisce all'applicazione client il messaggio di errore 1205. Questo errore non è irreversibile e non comporta l'interruzione del batch.
Questo errore si verifica quando Microsoft SQL Server individua un deadlock. Un deadlock si verifica quando due o più processi provano ad accedere a una risorsa bloccata da un altro processo. Poiché ogni processo richiede un'altra risorsa, nessun processo può essere completato. Quando viene individuato un deadlock, SQL Server esegue automaticamente il rollback del comando a cui è associata la durata di elaborazione minore e restituisce all'applicazione client il messaggio di errore 1205. Questo errore non è irreversibile e non comporta l'interruzione del batch.
In alcuni casi, a seguito della condizione di deadlock, una funzione DB-Library, ad esempio dbsqlexec, dbsqlok, dbresults o dbnextrow, restituisce FAIL. Il controllo dei codici restituiti da ogni funzione DB-Library deve essere sempre eseguito dal programma. Se una delle funzioni DB-Library restituisce FAIL, il programma deve annullare il batch e non proseguire con l'elaborazione. In alcuni casi, è possibile continuare l'esecuzione delle funzioni successive del batch. Tuttavia, poiché si è verificata una condizione di deadlock ed è stato eseguito il rollback delle funzioni che l'hanno causata, le funzioni successive del batch avranno probabilmente esito negativo generando un problema più grave, ad esempio un messaggio "Impossibile trovare l'oggetto".
In altri casi, è possibile che una condizione di deadlock non comporti la restituzione di FAIL da parte di una funzione DB-Library. In questi casi, il programma deve verificare la presenza del messaggio di errore 1205 nel gestore dei messaggi e inviare una notifica all'applicazione tramite la funzione dbsetuserdata. Successivamente, il programma deve controllare l'indicatore di deadlock dopo ogni chiamata DB-Library e annullare il batch se viene individuato un deadlock.
Sebbene sembri eccessivo annullare un batch dopo avere ricevuto il messaggio di deadlock 1205, si tratta in realtà di un'operazione necessaria perché il batch non viene sempre interrotto dal server in una condizione di deadlock. Se il batch non viene annullato, il tentativo di eseguire un nuovo batch può generare l'errore DB-Library 10038 relativo alla presenza di risultati in sospeso.
È anche possibile utilizzare l'istruzione SET DEADLOCK_PRIORITY e impostare il valore LOW o NORMAL. Questa istruzione consente di controllare la modalità di risposta della sessione in una condizione di deadlock. Se si imposta LOW, il processo diventa la vittima preferenziale della condizione di deadlock. Se invece si imposta NORMAL, la sessione utilizza il metodo di gestione del deadlock predefinito.
Se la condizione di deadlock persiste, spesso è possibile raccogliere ulteriori informazioni utilizzando il flag di traccia 1204, il quale attiva la stampa delle concatenazioni e della vittima di deadlock come illustrato di seguito:
*** Deadlock Detected *** == Process 7 chosen as deadlock victim == Deadlock Detected at: 1998-09-10 16:39:29.17 == Session participant information: SPID: 7 ECID: 0 Statement Type: UPDATE Input Buf: update t1 set c1 = c1 where c1 = 2 SPID: 8 ECID: 0 Statement Type: UPDATE Input Buf: update t1 set c1 = c1 where c1 = 1 == Deadlock Lock participant information: == Lock: KEY: 2:117575457:1 (010001000000) Database: tempdb Table: t1 Index: i1 - Held by: SPID 7 ECID 0 Mode "S" - Requested by: SPID 8 ECID 0 Mode "X" == Lock: KEY: 2:117575457:1 (020002000000) Database: tempdb Table: t1 Index: i1 - Held by: SPID 8 ECID 0 Mode "S" - Requested by: SPID 7 ECID 0 Mode "X"
Le informazioni sul deadlock possono essere interpretate nel modo seguente:
Nella prima sezione sono indicate la vittima, la data e l'ora del deadlock, insieme alle sessioni interessate. Per ogni sessione vengono visualizzati lo SPID corrente, il tipo di istruzione e una parte del buffer di input.
Nella seconda sezione vengono visualizzati i dettagli dei blocchi interessati dal deadlock. Nell'output precedente si noti che il deadlock interessa i blocchi chiave della tabella t1, indice i1. L'output relativo al deadlock visualizza i processi cui appartengono i blocchi interessati e le sessioni in attesa della concessione dei blocchi, nonché la relativa modalità di blocco.
Per impostazione predefinita, viene scelto come vittima del deadlock il processo che ha generato il log di dimensioni minori. Viene quindi eseguito automaticamente il rollback di tale processo. Per poter influire sulla sessione di cui eseguire il rollback, impostare DEADLOCK_PRIORITY per la sessione.
Nome | Descrizione | Valore predefinito |
Abilitato | Abilita o disabilita il flusso di lavoro. | Sì |
Intervallo (secondi) | Intervallo di tempo ricorrente in secondi in cui eseguire il flusso di lavoro. | 300 |
Priorità | Definisce la priorità dell'avviso. | 1 |
Gravità | Definisce la gravità dell'avviso. | 1 |
Tempo di sincronizzazione | Tempo di sincronizzazione |
|
Timeout (secondi) | Specifica il tempo di esecuzione consentito per il flusso di lavoro prima che venga chiuso e contrassegnato come non riuscito. | 200 |
Timeout per la connessione di database (secondi) | Il flusso di lavoro avrà esito negativo e registrerà un evento se non riesce ad accedere al database durante il periodo specificato. | 15 |
Target | Microsoft.SQLServer.Linux.DBEngine | ||
Category | EventCollection | ||
Enabled | True | ||
Alert Generate | True | ||
Alert Severity | Warning | ||
Alert Priority | Normal | ||
Remotable | True | ||
Alert Message |
| ||
Comment | Mom2017ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2017GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74} |
ID | Module Type | TypeId | RunAs |
---|---|---|---|
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ | DataSource | Microsoft.SQLServer.Linux.DataSource.EventCollectionFiltered | Default |
GenerateAlert | WriteAction | System.Health.GenerateAlert | Default |
<Rule ID="Microsoft.SQLServer.Linux.EventRule.DBEngine.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule" Target="SqlDiscL!Microsoft.SQLServer.Linux.DBEngine" Enabled="true" ConfirmDelivery="true" Remotable="true" Comment="Mom2017ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2017GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="_F6DA1507_12AF_11D3_AB21_00A0C98620CE_" Comment="{F6DA1507-12AF-11D3-AB21-00A0C98620CE}" TypeID="Microsoft.SQLServer.Linux.DataSource.EventCollectionFiltered">
<MachineName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/MachineName$</MachineName>
<NetbiosComputerName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/NetbiosComputerName$</NetbiosComputerName>
<InstanceName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/InstanceName$</InstanceName>
<ConnectionString>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/ConnectionString$</ConnectionString>
<InstanceVersion>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/Version$</InstanceVersion>
<InstanceEdition>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/Edition$</InstanceEdition>
<SqlExecTimeoutSeconds>60</SqlExecTimeoutSeconds>
<SqlTimeoutSeconds>15</SqlTimeoutSeconds>
<TimeoutSeconds>200</TimeoutSeconds>
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<EventDisplayNumber>1205</EventDisplayNumber>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="GenerateAlert" TypeID="Health!System.Health.GenerateAlert">
<Priority>1</Priority>
<Severity>1</Severity>
<AlertMessageId>$MPElement[Name="Microsoft.SQLServer.Linux.EventRule.DBEngine.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule.AlertMessage"]$</AlertMessageId>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/MachineName$</AlertParameter1>
<AlertParameter2>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/InstanceName$</AlertParameter2>
<AlertParameter3>Event ID: $Data/Property[@Name='EventID']$. $Data/Property[@Name='Message']$</AlertParameter3>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>