Ho una tabella in SQL Server che è CRUD-ed contemporaneamente da una stored procedure in esecuzione contemporaneamente in diverse sessioni:È possibile aggiungere una colonna Identity chiave primaria per risolvere problemi di deadlock?
|----------------|---------|
| <some columns> | JobGUID |
|----------------|---------|
la procedura funziona nel modo seguente:
- Genera un GUID.
- inserire alcuni record nella tabella condivisa sopra descritta, contrassegnandoli con il GUID dal punto 1.
- Eseguire alcuni aggiornamenti su tutti i record dal punto 2.
- selezionare i record dal punto 3 come uscita SP.
Ogni selezionare/inserimento/aggiornamento/DELETE nella stored procedure ha una clausola WHERE JobGUID = @jobGUID
, quindi la procedura funziona solo con i record che ha inserito il punto 2. Tuttavia, a volte, quando la stessa stored procedure viene eseguito in parallelo in diverse connessioni, si verificano deadlock sulla tabella condivisa. Ecco il grafico deadlock da SQL Server Profiler:
escalation dei blocchi non si verificano. Ho provato ad aggiungere suggerimenti di blocco (UPDLOCK, ROWLOCK)
a tutte le istruzioni DML e/o ad avvolgere il corpo della procedura in una transazione e utilizzando diversi livelli di isolamento, ma non è stato di aiuto. Ancora lo stesso blocco RID sul tavolo condiviso.
Successivamente ho scoperto che la tabella condivisa non aveva una colonna chiave/identità primaria. E una volta ho aggiunto, deadlock sembrano essere scomparsi:
alter table <SharedTable> add ID int not null identity(1, 1) primary key clustered
Quando ho rimuovere la colonna chiave primaria, i punti morti sono tornati. Quando lo aggiungo, non riesco più a riprodurre il deadlock.
Quindi, la domanda è, una colonna di identità chiave primaria è davvero in grado di risolvere deadlock o è solo una coincidenza?
Aggiornamento: come @Catcall suggerisce, ho cercato di creare una chiave naturale cluster primaria sulle colonne esistenti (senza l'aggiunta di una colonna di identità), ma ancora preso la stessa situazione di stallo (ovviamente, questa volta è stato un tasto bloccare invece del blocco RID).
è la colonna GUID indicizzati? –
@MartinSmith: Sì, ha un indice non univoco non cluster. –
Quale livello di isolamento della transazione sono gli SP in esecuzione? –