Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server - Insertions simultanées dans la table à partir de plusieurs clients - Vérifier la limite et bloquer

Je ne pense pas qu'il soit possible de le faire de manière déclarative.

S'il est garanti que toutes les insertions passent par la procédure stockée et que SaleValue n'est pas mise à jour une fois insérée, les éléments suivants devraient fonctionner (j'ai créé des noms de table et de colonne car ils n'étaient pas fournis dans la question initiale)

DECLARE @SumSaleValue MONEY

BEGIN TRAN

SELECT @SumSaleValue = SUM(SaleValue)
FROM dbo.Orders WITH (UPDLOCK, HOLDLOCK)
WHERE TransactionId = @TransactionId

IF @SumSaleValue > 1000
    BEGIN
    RAISERROR('Cannot do insert as total would exceed order limit',16,1);
    ROLLBACK;
    RETURN;
    END

/*Code for INSERT goes here*/

COMMIT

Le HOLDLOCK donne une sémantique sérialisable et verrouille toute la plage correspondant au TransactionId et le UPDLOCK empêche deux transactions simultanées de verrouiller la même plage, réduisant ainsi le risque de blocages.

Un index sur TransactionId,SaleValue serait préférable de prendre en charge cette requête.