Требования:
- Пользователь может купить любое количество подсчетов по своему желанию для любого пакета со случайным количеством сгенерированных очков для пользователя
- Когда сумма подсчета достигает определенного числа (например: 10000) пакет закрыт, и последний, купивший пакет, получает пакет
- Если последний пользователь купил пакет, превышающий 10000, остальные не будут вставлены
У меня такой вопрос: скажем, тысячи пользователей, кажется, купили последнее количество одного и того же пакета в одно и то же время, будет ли это работать точно так, как ожидалось?
Скажем, мы сейчас находимся в пакете 1 с суммой9997:
- Пользователь 1 для пользователя 100 купить 3 счет для пакета 1
- Пользователь 101 для пользователя 200 купить 5 счет для пакета 1
- Пользователь 201пользователю 300 купить 7 для пакета 1
Все в одно и то же время.
Можно ли быть уверенным, что следующая процедура сохранения не будет вставлена после подсчета суммы 10000?
Если не может быть суре, как я могу сделать это, чтобы удовлетворить сценарий и требования?
Таблица
UserID PackageID Count Point
-----------------------------
1 1 1 3.2
2 2 3 2.5
3 1 4 5.1
2 3 5 6.3
Хранимая процедура транзакции
CREATE PROCEDURE sp_InsertTransaction
@UserID INT,
@PackageID INT,
@Count INT,
@Point DECIMAL(30, 2)
AS
DECLARE @Sum INT = ISNULL((SELECT SUM(Count)
FROM [dbo].[Transaction]
WHERE PackageID = 1), 0);
IF (@Sum + @Count <= 10000)
BEGIN
INSERT INTO [dbo].[Transaction] (UserID, PackageID, Count, Point)
VALUES (@UserID, @PackageID, @Count, @Point)
-- Perform other db and update actions
END
END
ELSE IF (@Sum + @Count > 10000)
BEGIN
DECLARE @CanInsertCount INT = @Count - (1000 - @Sum);
DECLARE @CanInsertPoint DECIMAL(30, 2) = @CanInsertCount / @Count * @Point;
INSERT INTO [dbo].[Transaction] (UserID, PackageID, Count, Point)
VALUES (@UserID, @PackageID, @CanInsertCount, @CanInsertPoint )
-- Perform other db insert and update actions
END