Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server - Едновременни вмъквания в таблицата от множество клиенти - Проверете лимит и блокирайте

Не мисля, че е възможно това да се направи декларативно.

Ако е гарантирано, че всички вмъквания преминават през съхранената процедура и SaleValue не се актуализира, след като бъде вмъкната, тогава следващото трябва да работи (измислих имена на таблици и колони, тъй като те не бяха предоставени в първоначалния въпрос)

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 дава сериализираща семантика и заключва целия диапазон, съответстващ на TransactionId и UPDLOCK предотвратява две едновременни транзакции, заключващи един и същи диапазон, като по този начин намалява риска от блокиране.

Индекс на TransactionId,SaleValue би било най-добре да подкрепите тази заявка.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка SQL 2008 VS 2012:Неправилен синтаксис близо до ключовата дума „COMPUTE“

  2. SQL Server BCP експортира повреден файл?

  3. Часова част от поле DateTime в SQL

  4. основна pyodbc насипна вложка

  5. Как да премахнете пространството за раздели в колоната в SQL Server 2008