Bir MERGE
ifade gerçekleştiren saklı bir yordam var .
Birleştirme yapılırken varsayılan olarak tüm tabloyu kilitliyor gibi görünüyor.
Ben de başka şeyler yapıyorum bir işlem içinde bu saklı yordamı çağırıyorum ve keşke sadece etkilenen satırları kilitlemek istiyorum.
İpucu denedim ve MERGE INTO myTable WITH (READPAST)
daha az kilitli gibi görünüyordu. Ancak ms doc'da, birincil anahtarı bile atlayarak yinelenen anahtarlar ekleyebileceğini belirten bir uyarı vardı.
İşte benim tablo şeması:
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
İşte benim saklı yordam:
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
Kilitlemeyi şu şekilde gözlemliyorum:
begin tran
EXEC MergeTest 1, 1
Ve sonra başka bir oturumda:
EXEC MergeTest 2, 2
İkinci oturum, devam etmeden önce ilkinin tamamlanmasını bekler.
WITH (READPAST)
SQL Server'a diğer oturumlar tarafından kilitlenen satırları atlamasını bildirir. Bunu yapmak istediğinizden emin misiniz? Ayrıca, bu tablodaki kaç satırı değiştiriyorsunuz? Bize tablo şemasını (dizinler dahil) veMERGE
çalıştırdığınız ifadeyi gösterin .