sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server - Inserciones simultáneas en la tabla desde varios clientes - Comprobar límite y bloquear

No creo que sea posible hacer esto declarativamente.

Si se garantiza que todas las inserciones pasarán por el procedimiento almacenado y SaleValue no se actualiza una vez insertado, entonces debería funcionar lo siguiente (inventé nombres de tablas y columnas ya que no se proporcionaron en la pregunta inicial)

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

El HOLDLOCK proporciona semántica serializable y bloquea todo el rango que coincide con el TransactionId y el UPDLOCK evita que dos transacciones simultáneas bloqueen el mismo rango, lo que reduce el riesgo de interbloqueos.

Un índice en TransactionId,SaleValue sería mejor apoyar esta consulta.