Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server - Gleichzeitige Einfügungen in die Tabelle von mehreren Clients - Check Limit und Block

Ich glaube nicht, dass es möglich ist, dies deklarativ zu tun.

Wenn garantiert ist, dass alle Einfügungen die gespeicherte Prozedur durchlaufen und der SaleValue nach dem Einfügen nicht aktualisiert wird, sollte Folgendes funktionieren (ich habe Tabellen- und Spaltennamen erfunden, da diese in der ursprünglichen Frage nicht angegeben wurden)

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

Der HOLDLOCK gibt serialisierbare Semantik und sperrt den gesamten Bereich, der der TransactionId entspricht und den UPDLOCK verhindert, dass zwei gleichzeitige Transaktionen denselben Bereich sperren, wodurch das Risiko von Deadlocks verringert wird.

Ein Index für TransactionId,SaleValue wäre es am besten, diese Abfrage zu unterstützen.