Código para simular punto muerto

26

Estoy probando mi aplicación. Necesito un código estable que simule el punto muerto en el sitio de la base de datos (script SQL si es posible).

Gracias.

ADICIONAL:

Reproducción de puntos muertos que involucran solo una mesa

Garik
fuente
2
No entiendo bien la pregunta. ¿Puedes reformularlo un poco? Obviamente, las dos personas a continuación te entendieron lo suficientemente bien, pero no te estoy siguiendo del todo. ¿Te refieres a un código que "establemente" simula un punto muerto? ¿Qué harás después de que haya un punto muerto? ¿Solo quieres demostrar que puede suceder?
jcolebrand

Respuestas:

29

La mejor manera sería usar tablas que ya tienes. Cree dos tablas: tabla-a, tabla-b Para una prueba, incluso puede actualizar la misma columna con la misma información para no afectar ningún dato real.

Por ejemplo, UPDATE table_a set ID = ID donde ID = 100;

Abra dos sesiones en la misma base de datos. En uno, corre

BEGIN TRAN
update table_a set ID=ID where ID = 100;

En dos carreras

BEGIN TRAN
update table_b set ID=ID where ID =100;

Luego, copie las declaraciones de actualización en las sesiones opuestas y ejecútelas al mismo tiempo. En uno,

update table_b set ID=ID where ID =100;

En dos

update table_a set ID=ID where ID = 100;

Acabo de probar esto ahora y obtuve MS-SQL

Msg 1205, Level 13, State 56, Line 1
Transaction (Process ID 23) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
David Hall
fuente
7

Use el sp_getapplockprocedimiento almacenado del sistema para tomar los bloqueos que necesite en su código de muestra.

Estrictamente hablando, este es un semáforo de Dijkstra . Aunque sigue siendo muy útil

mrdenny
fuente
sp_getapplockNo arrojará un error. Esperará a que caduque el tiempo de espera o (si no hay tiempo de espera), regresará -3( msdn.microsoft.com/en-us/library/ms189823.aspx )
Ian Boyd
2

Aquí hay otro método similar al publicado anteriormente ->

CREATE TABLE Tbl1 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT)
CREATE TABLE Tbl2 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT REFERENCES dbo.Tbl1(id))

Script para ser usado en la Ventana de Consulta # 1

BEGIN TRAN
INSERT dbo.Tbl1 (id, col) VALUES (2, 999)

Script para ser usado en la Ventana de Consulta # 2

BEGIN TRAN
INSERT dbo.Tbl2 (id, col) VALUES (111, 2)

Script que se agregará a la Ventana de consulta # 1

INSERT dbo.Tbl2 (id, col) VALUES (111, 555)

Para obtener detalles adicionales sobre esto, consulte http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/

Ajit Ananthram
fuente