T SQl. Хранимая процедура + транзакция пишут лишние строки в БД
Простая задача: есть юзеры, надо снять деньги у одного и перевести другому. Транзакция 'запрос на снятие денег --- проверка баланса --- перевод' оформлена как хранимая процедура. Работает корректно.
USE Market; -- db name
GO
CREATE PROCEDURE TransferMoney
@SenderID INT,
@ReceiverID INT,
@TransferAmount DECIMAL(18,2)
AS
BEGIN
BEGIN TRANSACTION;
DECLARE @SenderBalance DECIMAL(18,2);
SELECT @SenderBalance = Amount FROM Customers WHERE Id = @SenderID;
DECLARE @ReceiverBalance DECIMAL(18,2);
SELECT @ReceiverBalance = Amount FROM Customers WHERE Id = @ReceiverID;
IF @SenderBalance < @TransferAmount
BEGIN
ROLLBACK TRANSACTION;
RAISERROR ('Insufficient balance in sender account', 16, 1);
RETURN;
END
-- Amount неудачное название, Balance был бы лучше
-- 'Customers' - TableName
UPDATE Customers
SET Amount = Amount - @TransferAmount
WHERE Id = @SenderID;
UPDATE Customers
SET Amount = Amount + @TransferAmount
WHERE Id = @ReceiverID;
INSERT INTO Customers(Amount)
VALUES (@SenderBalance);
INSERT INTO Customers(Amount)
VALUES (@ReceiverBalance);
COMMIT TRANSACTION;
END;
Вызов процедуры
USE Market;
DECLARE @N1 INT, @N2 INT, @S DECIMAL(18,2)
SET @N1 = 4
SET @N2 = 5
SET @S = 300
EXEC TransferMoney @N1, @N2, @S
Проблема в том, что при прошедшей транзакции в таблицу пишутся новые строки.
Как от этого избавиться?