ฉันมีขั้นตอนการจัดเก็บที่ดำเนินการคำสั่งMERGE
ดูเหมือนว่าจะล็อกทั้งตารางตามค่าเริ่มต้นเมื่อดำเนินการผสาน
ฉันกำลังเรียกขั้นตอนการจัดเก็บนี้ภายในธุรกรรมที่ฉันกำลังทำสิ่งอื่นอยู่ด้วยและฉันหวังว่ามันจะล็อคแถวที่ได้รับผลกระทบเท่านั้น
ฉันลองคำใบ้MERGE INTO myTable WITH (READPAST)
และดูเหมือนจะล็อคน้อยลง แต่มีคำเตือนในเอกสาร ms ที่บอกว่าสามารถแทรกคีย์ที่ซ้ำกันได้แม้จะข้ามคีย์หลัก
นี่คือคีตารางของฉัน:
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 เพียงข้ามแถวที่ถูกล็อกโดยเซสชันอื่น คุณแน่ใจหรือว่าต้องการทำเช่นนั้น? นอกจากนี้คุณมีการปรับเปลี่ยนกี่แถวในตารางนี้ แสดง schema ของตาราง (รวมถึงดัชนี) และMERGE
คำสั่งที่คุณกำลังใช้