sql >> Databáze >  >> RDS >> Sqlserver

SQL Server - Simultánní vkládání do tabulky z více klientů - Check Limit a Block

Nemyslím si, že je to možné udělat deklarativně.

Pokud je zaručeno, že všechny vložky projdou uloženou procedurou a hodnota SaleValue se po vložení neaktualizuje, mělo by fungovat následující (názvy tabulek a sloupců jsem si vymyslel, protože nebyly dodány v úvodní otázce)

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 poskytuje serializovatelnou sémantiku a uzamkne celý rozsah odpovídající TransactionId a UPDLOCK zabraňuje tomu, aby dvě souběžné transakce uzamkly stejný rozsah, čímž se snižuje riziko uváznutí.

Index na TransactionId,SaleValue nejlepší by bylo tento dotaz podpořit.




  1. Osvědčený postup:Uložte hodnoty velkých formulářů do databáze

  2. ORA-01591 - Oracle odstraní data ze vzdálené tabulky SQL serveru

  3. Krásné bloky Boilerplate

  4. PGLogical 1.1 balíčky pro PostgreSQL 9.6beta1