Ho una procedura memorizzata che esegue una MERGE
dichiarazione .
Sembra che blocchi l'intera tabella per impostazione predefinita quando si esegue l'unione.
Sto chiamando questa procedura memorizzata all'interno di una transazione in cui sto facendo anche altre cose e vorrei che bloccasse solo le righe interessate.
Ho provato il suggerimento MERGE INTO myTable WITH (READPAST)
e sembrava bloccarsi di meno. Ma c'era un avviso nel documento ms che diceva che poteva inserire chiavi duplicate, bypassando anche la chiave primaria.
Ecco il mio schema di tabella:
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
Ecco la mia procedura memorizzata:
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
Ecco come sto osservando il blocco:
begin tran
EXEC MergeTest 1, 1
E poi in un'altra sessione:
EXEC MergeTest 2, 2
La seconda sessione attende il completamento del primo prima di procedere.
WITH (READPAST)
indica a SQL Server di saltare solo le righe bloccate da altre sessioni. Sei sicuro di volerlo fare? Inoltre, quante righe in questa tabella stai modificando? Mostraci lo schema della tabella (inclusi gli indici) e l'MERGE
istruzione che stai eseguendo.