2013-08-23 13 views
5

ottengo una situazione di stallo in SQL Server 2012.Deadlock grafico che mostra sconosciuto Nome Indice

Dopo l'esecuzione di SQL Server Profiler, ho ottenuto un grafico situazione di stallo, come di seguito:

Deadlock graph

Quando spostato mouse i processi (ovale), entrambi i processi hanno mostrato query PrepareStatement identiche (sto usando JDBC).

La query che sto utilizzando è il seguente:

MERGE INTO MA4TB_MT_LOG_MSG USING (VALUES (1)) AS S(Num) ON (MSG_ID = ?) 
      WHEN MATCHED THEN 
       UPDATE SET 
        DIST_DATE = ?, 
        DIST_CODE = ? 
      WHEN NOT MATCHED THEN 
       INSERT (
        MSG_ID, DIST_DATE, DIST_CODE 
       ) VALUES (
        ?,?,? 
       ); 

La cosa che mi preoccupa è il nome dell'indice sotto la casella Chiave risorsa di blocco.

Non ho un indice chiamato "1" nella tabella MA4TB_MT_LOG_MSG.

MSG_ID è la chiave primaria di MA4TB_MT_LOG_MSG e non ci sono indici in DIST_DATE, DIST_CODE.

Sarebbe gradita qualsiasi forma di consulenza su questa situazione di deadlock.

Grazie in anticipo,

risposta

4

Iniziamo a rispondere alla prima domanda. Non ho un indice id = 1.

Sì, lo fai !!

Diamo un'occhiata al database di Adventure Works 2012 su SQL Server 2014 CTP2. Questa è la mia specifica del portatile.

C'è un nome di tabella [AWBuildVersion]. Ha un indice cluster proprio come il tuo tavolo. Sotto gli indici, possiamo vedere che il PK sta mostrando. Se otteniamo l'id oggetto della tabella (sys.objects) e cerchiamo la voce per l'indice (sys.indexes), possiamo vedere che l'indice è in posizione 1.

In breve, una chiave primaria per impostazione predefinita è un indice cluster.

http://technet.microsoft.com/en-us/library/ms177443(v=sql.105).aspx

enter image description here

Okay, allora che cosa fa una tabella senza un indice ha? Queste tabelle sono chiamate heap. Hanno un loro indice nella posizione zero che punta alla prima pagina IAM.

http://technet.microsoft.com/en-us/library/ms188270(v=sql.105).aspx

Il codice di seguito crea uno schema chiamato [furbo] e copia il tavolo [AWBuildVersion] per un nuovo schema utilizzando SELECT INTO. La cosa bella di SELECT INTO è che nessun indice viene riportato.

use AdventureWorks2012 
go 

create schema [crafty] authorization [dbo]; 
go 

select * into crafty.awbuildversion from dbo.awbuildversion 
go 

In breve, possiamo vedere lo heap definito con un indice in posizione zero.

enter image description here

Così che cosa è una situazione di stallo e che cosa fa richiesta modalità U significa?

Un deadlock si verifica quando due processi acquisiscono le risorse contemporaneamente ma non nello stesso ordine. In breve, entrambi i processi non possono procedere. Il motore seleziona la sessione con il minor tempo di rollback e uccide il processo.

http://technet.microsoft.com/en-us/library/ms178104(v=sql.105).aspx

una foto vale più di mille parole! Transaction 1 grabs resource 1. Transaction 2 grabs resource 2. Quando tentano di afferrare le risorse reciproche, viene creato un deadlock.

enter image description here

Che cosa fa un blocco e l'utente in modalità tasto U significa?

Per aggiornare la tabella, è necessario aggiornare le pagine di dati/indice. Ma le pagine di dati sono in realtà pagine indice (indice cluster) nella tabella. SQL Engine elimina un blocco (U) PDATE. Questo blocco verrà inoltrato a un blocco esclusivo (X) durante l'aggiornamento effettivo.

Quando due processi richiedono un blocco Esclusivo, esiste un potenziale di un deadlock.

Per completare questo argomento, i blocchi condivisi (SELECT) possono essere eseguiti senza bloccare (allo stesso tempo) Di solito un processo inizia con il blocco e si trasforma in un deadlock quando il thread del processo di deadlock di Engines rileva il grafico ciclico.

Il livello di isolamento predefinito è Non letto.

http://technet.microsoft.com/en-us/library/ms175519(v=sql.105).aspx

A questo punto, si ha una situazione di stallo.

Dove vai da qui?

1 - È probabile che più di una sessione (SPID) esegua lo stesso codice. Perché? Puoi cambiare questo in modo che solo un processo esegua il codice alla volta?

2 - Prendere il TSQL effettivo generato da JDBC. Questo può essere fatto con SQL Profiler e/o guardando attraverso i tuoi DMV.

L'istruzione di unione esegue sia un UPDATE e/o INSERT. Quindi un'operazione composta.

3 - È possibile modificare il livello di isolamento in serializzabile?

Questo aggiungerà più blocchi e probabilmente cambierà il problema del deadlock in un problema di timeout. Vedi l'articolo di Kalen Daleny su come impostare LOCK_TIMEOUT. Dovrai modificare il codice per riprovare l'operazione con un po 'di ritardo.

http://sqlmag.com/sql-server/inside-sql-server-controlling-locking

Spero che queste informazioni ti aiuta.

Si prega di inviare il vostro TSQL se avete bisogno di più aiuto.

0

grafico Il blocco sembra mostrare l'intera tabella viene bloccata.

Fondamentalmente, ti suggerisco di controllare la dichiarazione MERGE che hai scritto. Assicurarsi di disporre di condizioni di filtro appropriate. Cerca di avere indici appropriati in modo che l'accesso ai dati sia più veloce e la durata del blocco sia ridotta. Le transazioni sono implementate solo quando dovrebbero essere lì. Comprendi quale processo sta creando lo scenario di deadlock su MA4TB_MT_LOG_MS e poi prova ad indirizzare quel pezzo di codice. Aumentando la selettività di blocco (cioè riga \ blocco pagina anziché blocco tabella) e durata.

Un sacco di cose da guardare!

0

penso "nome di indice: 1" si riferisce al id oggetto di un indice cluster

1

SQL Profiler genera più informazioni di quelle visualizzate nel grafico/passaggio del mouse, e queste informazioni può o non può fare più luce sul tuo problema Prova questo:

  • Selezionare le righe in Profiler che provoca il grafico da visualizzare
  • fare una "copia" (Ctrl + C, o l'opzione di menu)
  • incollare questo in un editor di testo (ad esempio una finestra di query SSMS)
  • Quello che vuoi sono i contenuti XML della colonna "Testo" di Profiler - elimina tutto il resto
  • Apri questo XML in un editor XML (qualunque cosa tu abbia che lo renda leggibile, io uso l'XML di MIcrosoft Blocco note)
  • Eseguire il drill down. Ci vuole un po ', ma una volta capito il layout (gerarchia, nomi dei tag, ecc.) Le cose dovrebbero essere chiare