Déclencheur provoque un blocage?

Je suis en cours d'exécution dans une impasse après j'ai ajouté un déclencheur. Il y a un UserBalanceHistory table qui a une ligne pour chaque transaction et un Amount colonne. Un déclencheur a été ajouté à la somme Amount colonne et placer le résultat dans le User table, Balance colonne.

CREATE TABLE [User]
(
    ID INT IDENTITY,
    Balance MONEY,
    CONSTRAINT PK_User PRIMARY KEY (ID)
);

CREATE TABLE UserBalanceHistory
(
    ID INT IDENTITY,
    UserID INT NOT NULL,
    Amount MONEY NOT NULL,
    CONSTRAINT PK_UserBalanceHistory PRIMARY KEY (ID),
    CONSTRAINT FK_UserBalanceHistory_User FOREIGN KEY (UserID) REFERENCES [User] (ID)
);

CREATE NONCLUSTERED INDEX IX_UserBalanceHistory_1 ON UserBalanceHistory (UserID) INCLUDE (Amount);

CREATE TRIGGER TR_UserBalanceHistory_1 ON UserBalanceHistory AFTER INSERT, UPDATE, DELETE AS
BEGIN
    DECLARE @UserID INT;

    SELECT TOP 1 @UserID = u.UserID
    FROM
    (
            SELECT UserID FROM inserted
        UNION
            SELECT UserID FROM deleted
    ) u;

    EXEC dbo.UpdateUserBalance @UserID;
END;

CREATE PROCEDURE UpdateUserBalance
    @UserID INT
AS
BEGIN
    DECLARE @Balance MONEY;

    SET @Balance = (SELECT SUM(Amount) FROM UserBalanceHistory WHERE UserID = @UserID);

    UPDATE [User]
    SET Balance = ISNULL(@Balance, 0)
    WHERE ID = @UserID;
END;

J'ai également tourné sur READ_COMMITTED_SNAPSHOT:

ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON;

J'ai un parallèle processus en cours d'exécution qui est de la création de UserBalanceHistory entrées, apparemment, si elle est de travailler sur le même User dans le même temps, le blocage se produit. Des Suggestions?

Je veux que vous compreniez que votre code de déclencheur est extrêmement pauvre et dangereux. Vous ne pourrez JAMAIS faire l'hypothèse qu'il n'y aura qu'un seul enregistrement dans insérées ou supprimées. Ce code pourrait causer beaucoup de problèmes d'intégrité des données la première fois que quelqu'un nécessaires à l'exécution d'un ensemble basé sur insérer (comme inmporting données historiques à partir d'un nouveau client)
Yep, bon je vais corriger ça.

OriginalL'auteur Josh M. | 2011-06-08