每次向我的客户发送消息时,都会在名为“确认”的表中插入一个新条目。在插入期间,我需要获取当天发送给我的特定客户的确认的“ SequenceNumber”列的最大值。然后,此SequenceNumber递增1,并用于新记录。
约束条件是确保生成连续的唯一序列号,以用于白天发送给同一客户的确认。
我已经能够使用Serializable隔离级别和TABLOCKX提示来实现此目的。此解决方案有效,但不能在并发方面提供最佳性能。您知道如何实施此解决方案以提供更好的性能吗?
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT @SequenceNumber = MAX (SequenceNumber)
FROM dbo.Confirmation WITH (TABLOCKX)
WHERE DATEDIFF(dd, CreationDate, @creationDate) = 0 AND
ClientId = @recipientId
IF (@SequenceNumber IS NULL)
SET @SequenceNumber = 1
ELSE
SET @SequenceNumber = @SequenceNumber+1
INSERT INTO Confirmation (...) VALUES (..., @SequenceNumber, ...)
COMMIT TRAN
在serializable
您不需要任何提示。该引擎为您提供了按序列执行。在这里,这等于锁定了希望存在的索引中的最后一行SequenceNumber
。基本上可以,但是您需要重试死锁。
我会用这个:
SELECT @SequenceNumber = MAX (SequenceNumber)
FROM dbo.Confirmation WITH (UPDLOCK, HOLDLOCK, ROWLOCK)
WHERE ...
为此,您不需要任何特定的隔离级别,因为可以HOLDLOCK
强制进行序列化。这几乎总是无死锁的(几乎是因为引擎没有做出正式保证)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句