query los evitar como sql sql-server concurrency deadlock

los - ¿Cómo simular DEADLOCK en SQL Server?



sql server deadlock query (1)

Estoy tratando de simular un interbloqueo en SQL Server.

_|worker_id|salary| 1|1 |100 | 2|2 |300 |

Transacción 1 completada en 5 segundos.

/* TRANSACTION 1*/ Use dbmcw; DECLARE @sal1 INT, @sal2 int; BEGIN TRAN; SELECT @sal1 = salary FROM dbo.deadlock_demonstration WITH(UPDLOCK) WHERE worker_id = 1; WAITFOR DELAY ''00:00:05.000''; SELECT @sal2 = salary FROM dbo.deadlock_demonstration WITH(UPDLOCK) WHERE worker_id = 2; COMMIT TRAN;

La transacción 2 terminó en 3 segundos.

/* TRANSACTION 2*/ Use dbmcw; DECLARE @sal1 INT, @sal2 int; BEGIN TRAN; SELECT @sal2 = salary FROM dbo.deadlock_demonstration WITH(UPDLOCK) WHERE worker_id = 2; SELECT @sal1 = salary FROM dbo.deadlock_demonstration WITH(UPDLOCK) WHERE worker_id = 1; COMMIT TRAN;

SQL Server no está dando ningún error. No se produjo el interbloqueo. ¿Qué debo cambiar para simular un punto muerto?


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 abre dos ventanas de consulta vacías en SSMS. Coloque el código para la sesión 1 en una ventana de consulta y el código para 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 está solicitando 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> ===========================================================

Un callejón sin salida resulta; una transacción finaliza y la otra transacción se cancela y se envía un 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, limpie las tablas temporales:

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