sql >> Databasteknik >  >> RDS >> Sqlserver

Hur simulerar man DEADLOCK på SQL Server?

Du kan skapa ett dödläge genom att använda stegen nedan. Skapa först de globala temptabellerna med exempeldata.

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

Öppna nu två tomma frågefönster i SSMS. Placera koden för session 1 i det ena frågefönstret och koden för session 2 i det andra frågefönstret. Utför sedan var och en av de två sessionerna steg för steg, gå fram och tillbaka mellan de två frågefönstren efter behov. Observera att varje transaktion har ett lås på en resurs som den andra transaktionen också begär låsning på.

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

Ett dödläge resulterar; en transaktion avslutas och den andra transaktionen avbryts och felmeddelande 1205 skickas till klienten.

Stäng SSMS-frågefönstren för "Session 1" och "Session 2" för att utföra (eller återställa) alla öppna transaktioner. Slutligen, rensa temptabellerna:

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



  1. Mapping array med Hibernate

  2. Hur man jämför datum med hjälp av en klausul i viloläge

  3. Distribuerad databastransaktion kontra korsdatabastransaktion

  4. Jag vill göra INSERT utan post i DB