Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server - Jednoczesne wstawianie do tabeli od wielu klientów - Sprawdź limit i blokuj

Nie sądzę, że można to zrobić deklaratywnie.

Jeśli wszystkie wstawki mają gwarancję przejścia przez procedurę składowaną, a wartość SaleValue nie jest aktualizowana po wstawieniu, poniższe powinny działać (wymyśliłem nazwy tabel i kolumn, ponieważ nie zostały one podane w początkowym pytaniu)

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 daje serializowalną semantykę i blokuje cały zakres pasujący do TransactionId i UPDLOCK zapobiega dwóm równoczesnym transakcjom blokującym ten sam zakres, zmniejszając w ten sposób ryzyko zakleszczeń.

Indeks TransactionId,SaleValue najlepiej będzie wspierać to zapytanie.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można skompilować składnika SSIS; Brakujący zespół w Visual Studio 2008

  2. SQL Server 2008, różne klauzule WHERE z jednym zapytaniem

  3. Jak korzystać z Projektanta zapytań w SQL Server

  4. Zmiana właściciela stołu

  5. Jak korzystać z aspnet_regsql.exe