sql >> Database >  >> RDS >> Sqlserver

SQL Server - Gelijktijdige invoegingen aan de tabel van meerdere clients - Check Limit en Block

Ik denk niet dat het mogelijk is om dit declaratief te doen.

Als alle invoegingen gegarandeerd door de opgeslagen procedure gaan en de SaleValue niet wordt bijgewerkt nadat deze is ingevoegd, zou het volgende moeten werken (ik heb tabel- en kolomnamen verzonnen omdat deze niet in de oorspronkelijke vraag waren opgegeven)

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

De HOLDLOCK geeft serialiseerbare semantiek en vergrendelt het hele bereik dat overeenkomt met de TransactionId en de UPDLOCK voorkomt dat twee gelijktijdige transacties hetzelfde bereik blokkeren, waardoor het risico op impasses wordt verkleind.

Een index op TransactionId,SaleValue zou het beste zijn om deze vraag te ondersteunen.




  1. Hoe een rij kopiëren en in dezelfde tabel invoegen met een autoincrement-veld in MySQL?

  2. Hoe maak je een oracle.sql.ARRAY-object aan?

  3. Hulp bij het grijpen (INNERLIJKE?) JOIN

  4. Hoe voorkom je het gebruik van cijfers in een VARCHAR-kolom met mysql?