sql >> Databáze >  >> RDS >> Sqlserver

Jak simulovat DEADLOCK na SQL Server?

Zablokování můžete vytvořit pomocí kroků uvedených níže. Nejprve vytvořte globální dočasné tabulky s ukázkovými daty.

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

Nyní otevřete dvě prázdná okna dotazu v SSMS. Umístěte kód pro relaci 1 do jednoho okna dotazu a kód pro relaci 2 do druhého okna dotazu. Poté proveďte každou ze dvou relací krok za krokem a podle potřeby přecházejte tam a zpět mezi dvěma okny dotazu. Všimněte si, že každá transakce má zámek na zdroji, na který druhá transakce také požaduje zámek.

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

Výsledkem je uváznutí; jedna transakce je dokončena a druhá transakce je přerušena a klientovi je odeslána chybová zpráva 1205.

Zavřete okna dotazů SSMS pro "Relace 1" a "Relace 2", abyste potvrdili (nebo vrátili zpět) všechny otevřené transakce. Nakonec vyčistěte dočasné tabulky:

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



  1. SqlAlchemy:získání id posledního vloženého záznamu

  2. PL/pgSQL provádět vs

  3. Python pymySQL odesílá řetězec s uvozovkami

  4. Mysql odstranit starší duplikáty