Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come simulare DEADLOCK su SQL Server?

È possibile creare un deadlock utilizzando i passaggi illustrati di seguito. Innanzitutto, crea le tabelle temporanee globali con dati di esempio.

--Two global temp tables with sample data for demo purposes.
CREATE TABLE ##Employees (
    EmpId INT IDENTITY,
    EmpName VARCHAR(16),
    Phone VARCHAR(16)
)
GO

INSERT INTO ##Employees (EmpName, Phone)
VALUES ('Martha', '800-555-1212'), ('Jimmy', '619-555-8080')
GO

CREATE TABLE ##Suppliers(
    SupplierId INT IDENTITY,
    SupplierName VARCHAR(64),
    Fax VARCHAR(16)
)
GO

INSERT INTO ##Suppliers (SupplierName, Fax)
VALUES ('Acme', '877-555-6060'), ('Rockwell', '800-257-1234')
GO

Ora apri due finestre di query vuote in SSMS. Inserire il codice per la sessione 1 in una finestra della query e il codice per la sessione 2 nell'altra finestra della query. Quindi eseguire ciascuna delle due sessioni passo dopo passo, andando avanti e indietro tra le due finestre di query come richiesto. Tieni presente che ogni transazione ha un blocco su una risorsa per la quale anche l'altra transazione richiede un blocco.

Session 1                   | Session 2
===========================================================
BEGIN TRAN;                 | BEGIN TRAN;
===========================================================
UPDATE ##Employees
SET EmpName = 'Mary'
WHERE EmpId = 1
===========================================================
                             | UPDATE ##Suppliers
                             | SET Fax = N'555-1212'
                             | WHERE SupplierId = 1
===========================================================
UPDATE ##Suppliers
SET Fax = N'555-1212'
WHERE SupplierId = 1
===========================================================
<blocked>                    | UPDATE ##Employees
                             | SET Phone = N'555-9999'
                             | WHERE EmpId = 1
===========================================================
                             | <blocked>
===========================================================

Risulta una situazione di stallo; una transazione termina e l'altra viene interrotta e il messaggio di errore 1205 viene inviato al client.

Chiudere le finestre di query SSMS per "Sessione 1" e "Sessione 2" per eseguire il commit (o il rollback) di tutte le transazioni aperte. Infine, ripulisci le tabelle temporanee:

DROP TABLE ##Employees
GO
DROP TABLE ##Suppliers
GO