반응형
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
반응형
'programing' 카테고리의 다른 글
파이썬에서 0x 없이 hex()를 사용하는 방법은 무엇입니까? (0) | 2023.08.13 |
---|---|
활동과 단편 활동의 차이 (0) | 2023.08.13 |
각도 2에서 편집 가능한 div의 콘텐츠에서 [(ngModel)]을 사용하는 방법은? (0) | 2023.08.13 |
chart.js v2가 있는 차트에서 범례 제거 (0) | 2023.08.13 |
원격 클라이언트에서 Mariadb를 연결할 수 없습니다. (0) | 2023.08.08 |