Ich habe eine gespeicherte Prozedur, die eine MERGE
Anweisung ausführt .
Es scheint, als würde beim Durchführen der Zusammenführung standardmäßig die gesamte Tabelle gesperrt.
Ich rufe diese gespeicherte Prozedur innerhalb einer Transaktion auf, in der ich auch einige andere Dinge mache, und ich wünschte, sie würde nur die betroffenen Zeilen sperren.
Ich versuchte es mit dem Hinweis MERGE INTO myTable WITH (READPAST)
und es schien weniger zu sperren. Im ms-Dokument wurde jedoch eine Warnung angezeigt, die besagt, dass doppelte Schlüssel eingefügt werden können, wobei sogar der Primärschlüssel umgangen wird.
Hier ist mein Tabellenschema:
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
Hier ist meine gespeicherte Prozedur:
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
So beobachte ich die Verriegelung:
begin tran
EXEC MergeTest 1, 1
Und dann in einer anderen Sitzung:
EXEC MergeTest 2, 2
Die zweite Sitzung wartet, bis die erste abgeschlossen ist, bevor Sie fortfahren.
WITH (READPAST)
Weist SQL Server an, nur Zeilen zu überspringen, die von anderen Sitzungen gesperrt wurden. Bist du sicher, dass du das machen willst? Wie viele Zeilen in dieser Tabelle ändern Sie? Zeigen Sie uns das Tabellenschema (einschließlich Indizes) und dieMERGE
Anweisung, die Sie ausführen.