J'ai une procédure stockée qui exécute une MERGE
instruction .
Il semble qu'il verrouille la table entière par défaut lors de la fusion.
J'appelle cette procédure stockée à l'intérieur d'une transaction où je fais également d'autres choses et je souhaite que cela ne verrouille que les lignes affectées.
J'ai essayé l'indice MERGE INTO myTable WITH (READPAST)
et il semblait se verrouiller moins. Mais il y avait un avertissement dans le ms doc qui disait qu'il pouvait insérer des clés en double, contournant même la clé primaire.
Voici mon schéma de table:
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
Voici ma procédure stockée:
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
Voici comment j'observe le verrouillage:
begin tran
EXEC MergeTest 1, 1
Et puis dans une autre session:
EXEC MergeTest 2, 2
La deuxième session attend la fin de la première avant de continuer.
WITH (READPAST)
indique à SQL Server d'ignorer simplement les lignes verrouillées par d'autres sessions. Êtes-vous sûr de vouloir faire ça? De plus, combien de lignes de ce tableau modifiez-vous? Montrez-nous le schéma de la table (y compris les index) et l'MERGE
instruction que vous exécutez.