Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como simular DEADLOCK no SQL Server?


Você pode criar um impasse usando as etapas mostradas abaixo. Primeiro, crie as tabelas temporárias globais com dados de amostra.
--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

Agora abra duas janelas de consulta vazias no SSMS. Coloque o código da sessão 1 em uma janela de consulta e o código da sessão 2 na outra janela de consulta. Em seguida, execute cada uma das duas sessões passo a passo, indo e voltando entre as duas janelas de consulta conforme necessário. Observe que cada transação tem um bloqueio em um recurso para o qual a outra transação também está solicitando um bloqueio.
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>
===========================================================

Um impasse resulta; uma transação termina e a outra transação é abortada e a mensagem de erro 1205 é enviada ao cliente.

Feche as janelas de consulta do SSMS para "Sessão 1" e "Sessão 2" para confirmar (ou reverter) quaisquer transações abertas. Por fim, limpe as tabelas temporárias:
DROP TABLE ##Employees
GO
DROP TABLE ##Suppliers
GO