MERGE
명령문 을 수행하는 저장 프로 시저가 있습니다.
병합을 수행 할 때 기본적으로 전체 테이블을 잠그는 것처럼 보입니다.
다른 저장 작업을 수행하는 트랜잭션 내 에서이 저장 프로 시저를 호출하고 영향을받는 행만 잠그기를 바랍니다.
나는 힌트를 시도했지만 MERGE INTO myTable WITH (READPAST)
덜 잠그는 것처럼 보였다. 그러나 ms doc에는 기본 키조차 무시하고 중복 키를 삽입 할 수 있다는 경고가있었습니다.
내 테이블 스키마는 다음과 같습니다.
CREATE TABLE StudentDetails
(
StudentID INTEGER PRIMARY KEY,
StudentName VARCHAR(15)
)
GO
INSERT INTO StudentDetails
VALUES(1,'WANG')
INSERT INTO StudentDetails
VALUES(2,'JOHNSON')
GO
CREATE TABLE StudentTotalMarks
(
Id INT IDENTITY PRIMARY KEY,
StudentID INTEGER REFERENCES StudentDetails,
StudentMarks INTEGER
)
GO
INSERT INTO StudentTotalMarks
VALUES(1,230)
INSERT INTO StudentTotalMarks
VALUES(2,255)
GO
내 저장 프로 시저는 다음과 같습니다.
CREATE PROCEDURE MergeTest
@StudentId int,
@Mark int
AS
WITH Params
AS
(
SELECT @StudentId as StudentId,
@Mark as Mark
)
MERGE StudentTotalMarks AS stm
USING Params p
ON stm.StudentID = p.StudentId
WHEN MATCHED AND stm.StudentMarks > 250 THEN DELETE
WHEN MATCHED THEN UPDATE SET stm.StudentMarks = p.Mark
WHEN NOT MATCHED THEN
INSERT(StudentID,StudentMarks)
VALUES(p.StudentId, p.Mark);
GO
잠금을 관찰하는 방법은 다음과 같습니다.
begin tran
EXEC MergeTest 1, 1
그리고 다른 세션에서 :
EXEC MergeTest 2, 2
두 번째 세션은 진행하기 전에 첫 번째 세션이 완료되기를 기다립니다.
WITH (READPAST)
다른 세션에서 잠근 행만 건너 뛰도록 SQL Server에 지시합니다. 정말로 그렇게 하시겠습니까? 또한이 테이블에서 몇 개의 행을 수정하고 있습니까? 테이블 스키마 (인덱스 포함)와MERGE
실행중인 명령문을 표시하십시오 .