Триггер вызывает взаимоблокировку?

Я зашел в тупик после того, как добавил триггер. Существует таблица UserBalanceHistory , в которой есть одна строка для каждой транзакции и столбец Сумма .Был добавлен триггер для суммирования столбца Сумма и помещения результата в связанную таблицу Пользователь , столбец Баланс .

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;

Я также включил READ_COMMITTED_SNAPSHOT :

ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON;

У меня работает параллельный процесс, который создает записи UserBalanceHistory , очевидно, если он одновременно работает с одним и тем же пользователем , тупик происходит. Предложения?

8
задан Yuck 1 December 2017 в 03:05
поделиться