Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie simuliert man DEADLOCK auf SQL Server?

Sie können einen Deadlock erstellen, indem Sie die unten gezeigten Schritte ausführen. Erstellen Sie zuerst die globalen temporären Tabellen mit Beispieldaten.

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

Öffnen Sie nun zwei leere Abfragefenster in SSMS. Platzieren Sie den Code für Sitzung 1 in einem Abfragefenster und den Code für Sitzung 2 im anderen Abfragefenster. Führen Sie dann jede der beiden Sitzungen Schritt für Schritt aus, wobei Sie je nach Bedarf zwischen den beiden Abfragefenstern hin und her wechseln. Beachten Sie, dass jede Transaktion eine Sperre für eine Ressource hat, für die die andere Transaktion ebenfalls eine Sperre anfordert.

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

Es entsteht ein Deadlock; eine Transaktion wird beendet und die andere Transaktion wird abgebrochen und die Fehlermeldung 1205 wird an den Client gesendet.

Schließen Sie die SSMS-Abfragefenster für „Sitzung 1“ und „Sitzung 2“, um alle offenen Transaktionen festzuschreiben (oder rückgängig zu machen). Bereinigen Sie zuletzt die temporären Tabellen:

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