MSSQL in Linux: La transazione è stata interrotta a causa di un deadlock delle risorse con un altro processo. Eseguire di nuovo la transazione

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 (Rule)

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.

Knowledge Base article:

Riepilogo

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.

Risoluzioni

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:

Parametri di cui è possibile eseguire l'override

Nome

Descrizione

Valore predefinito

Abilitato

Abilita o disabilita il flusso di lavoro.

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

Element properties:

TargetMicrosoft.SQLServer.Linux.DBEngine
CategoryEventCollection
EnabledTrue
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
RemotableTrue
Alert Message
MSSQL in Linux: La transazione è stata interrotta a causa di un deadlock delle risorse con un altro processo. Eseguire di nuovo la transazione
{0}
CommentMom2017ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2017GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}

Member Modules:

ID Module Type TypeId RunAs 
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ DataSource Microsoft.SQLServer.Linux.DataSource.EventCollectionFiltered Default
GenerateAlert WriteAction System.Health.GenerateAlert Default

Source Code:

<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>