교착 상태를 시뮬레이션하는 코드


26

내 응용 프로그램을 테스트 하고 데이터베이스 사이트의 교착 상태 를 안정적으로 시뮬레이션하는 코드가 필요 합니다 (가능한 경우 SQL 스크립트).

고맙습니다.

추가 :

하나의 테이블 만 포함하는 교착 상태 재생


2
나는 그 질문을 이해하지 못한다. 당신은 조금 말로 표현할 수 있습니까? 분명히 아래 두 사람이 당신을 충분히 이해했지만, 나는 당신을 잘 따르지 않습니다. 교착 상태를 "안정적으로"시뮬레이트하는 코드를 의미합니까? 교착 상태가 발생한 후 무엇을 하시겠습니까? 당신은 그것이 일어날 수 있음을 증명하고 싶습니까?
jcolebrand

답변:


29

가장 좋은 방법은 이미 가지고있는 테이블을 사용하는 것입니다. 두 개의 테이블 (table-a, table-b) 만들기 테스트를 위해 동일한 정보로 동일한 열을 업데이트하여 실제 데이터에 영향을 미치지 않을 수도 있습니다.

예를 들어 UPDATE table_a set ID = ID, 여기서 ID = 100;

동일한 데이터베이스에 대해 두 개의 세션을 엽니 다. 하나에, 실행

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

두 번 실행

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

그런 다음 업데이트 명령문을 반대 세션에 복사하고 동시에 실행하십시오. 하나의,

update table_b set ID=ID where ID =100;

두개의

update table_a set ID=ID where ID = 100;

방금 이것을 시도하고 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.


2

위에서 게시 한 것과 비슷한 또 다른 방법이 있습니다->

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

쿼리 창 # 1에서 사용될 스크립트

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

쿼리 창 # 2에서 사용될 스크립트

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

쿼리 창 # 1에 추가 될 스크립트

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

이에 대한 자세한 내용은 http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.