programing

SQL Server에서 교착 상태를 시뮬레이션하는 방법은 무엇입니까?

yellowcard 2023. 8. 13. 09:37
반응형

SQL Server에서 교착 상태를 시뮬레이션하는 방법은 무엇입니까?

SQL Server에서 교착 상태를 시뮬레이션하려고 합니다.

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

1번 트랜잭션이 5초 안에 완료되었습니다.

/* 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;

트랜잭션 2가 3초 만에 완료되었습니다.

/* 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에서 오류가 발생하지 않습니다.교착 상태가 발생하지 않았습니다.교착 상태를 시뮬레이션하려면 무엇을 변경해야 합니까?

아래 표시된 단계를 사용하여 교착 상태를 만들 수 있습니다.먼저 표본 데이터를 사용하여 전역 온도 표를 만듭니다.

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

이제 SSMS에서 두 개의 빈 쿼리 창을 엽니다. 하나의 쿼리 창에 세션 1의 코드를 배치하고 다른 쿼리 창에 세션 2의 코드를 배치합니다.그런 다음 필요에 따라 두 쿼리 창 사이를 왔다 갔다 하면서 두 세션을 각각 단계별로 실행합니다.각 트랜잭션에는 다른 트랜잭션에서도 잠금을 요청하는 리소스에 대한 잠금이 있습니다.

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

교착 상태가 발생합니다. 한 트랜잭션은 완료되고 다른 트랜잭션은 중단되며 오류 메시지 1205가 클라이언트로 전송됩니다.

열려 있는 트랜잭션을 커밋(또는 롤백)하려면 "Session 1" 및 "Session 2"에 대한 SSMS 쿼리 창을 닫습니다.마지막으로 온도 테이블을 정리합니다.

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

언급URL : https://stackoverflow.com/questions/22825147/how-to-simulate-deadlock-on-sql-server

반응형