sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo simular DEADLOCK en SQL Server?

Puede crear un interbloqueo siguiendo los pasos que se muestran a continuación. Primero, cree las tablas temporales globales con datos de muestra.

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

Ahora abra dos ventanas de consulta vacías en SSMS. Coloque el código de la sesión 1 en una ventana de consulta y el código de la sesión 2 en la otra ventana de consulta. Luego ejecute cada una de las dos sesiones paso a paso, yendo y viniendo entre las dos ventanas de consulta según sea necesario. Tenga en cuenta que cada transacción tiene un bloqueo en un recurso en el que la otra transacción también solicita un bloqueo.

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

Se produce un punto muerto; una transacción finaliza y la otra transacción se aborta y se envía el mensaje de error 1205 al cliente.

Cierre las ventanas de consulta de SSMS para "Sesión 1" y "Sesión 2" para confirmar (o revertir) cualquier transacción abierta. Por último, limpia las tablas temporales:

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