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 2 つの同時トランザクションが同じ範囲をロックするのを防ぎ、デッドロックのリスクを軽減します。

    TransactionId,SaleValue のインデックス このクエリをサポートするのが最善でしょう。




    1. GROUP BY句のエイリアス?

    2. PostgreSQLJSON列をHibernateエンティティプロパティにマッピングする

    3. データベースインスタンスの状態を監視する方法

    4. MySQL Galeraクラスターレプリケーションを使用した地理分散クラスターの作成:パート2