Tôi có một thủ tục lưu trữ thực hiện một MERGE
tuyên bố .
Có vẻ như nó khóa toàn bộ bảng theo mặc định khi thực hiện hợp nhất.
Tôi đang gọi thủ tục được lưu trữ này bên trong một giao dịch nơi tôi cũng đang thực hiện một số nội dung khác và tôi ước nó chỉ khóa các hàng bị ảnh hưởng.
Tôi đã thử gợi ý MERGE INTO myTable WITH (READPAST)
và nó dường như khóa ít hơn. Nhưng có một cảnh báo trong tài liệu ms nói rằng nó có thể chèn các khóa trùng lặp, bỏ qua ngay cả khóa chính.
Đây là lược đồ bảng của tôi:
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
Đây là thủ tục lưu trữ của tôi:
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
Đây là cách tôi quan sát khóa:
begin tran
EXEC MergeTest 1, 1
Và sau đó trong một phiên khác:
EXEC MergeTest 2, 2
Phiên thứ hai chờ đợi lần đầu tiên hoàn thành trước khi tiếp tục.
WITH (READPAST)
hướng dẫn SQL Server bỏ qua các hàng bị khóa bởi các phiên khác. Bạn có chắc chắn muốn làm điều đó? Ngoài ra, có bao nhiêu hàng trong bảng này bạn đang sửa đổi? Chỉ cho chúng tôi lược đồ bảng (bao gồm các chỉ mục) vàMERGE
câu lệnh bạn đang chạy.