sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server - Samtidiga insättningar i tabellen från flera klienter - Kontrollera gräns och blockera

Jag tror inte att det är möjligt att göra detta deklarativt.

Om alla bilagor garanterat går igenom den lagrade proceduren och SaleValue inte uppdateras när det väl har infogats, bör följande fungera (jag skapade tabell- och kolumnnamn eftersom dessa inte angavs i den första frågan)

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

HOLDLOCK ger serialiserbar semantik och låser hela intervallet som matchar TransactionId och UPDLOCK förhindrar två samtidiga transaktioner som låser samma intervall, vilket minskar risken för dödlägen.

Ett index på TransactionId,SaleValue skulle vara bäst att stödja denna fråga.




  1. två vänster yttre koppling fungerar inte Oracle sql

  2. Hur får man alla värden i en kolumn med PHP?

  3. Ska jag ha min Postgres-katalog bredvid min projektmapp? Om så är fallet, hur?

  4. SQL-fråga för att returnera en rad även om den inte hittas, med åtminstone i parametrar