Проверка логики вставки параллелизма в SQL Server 2012 - PullRequest
0 голосов
/ 10 декабря 2018

Требования:

  • Пользователь может купить любое количество подсчетов по своему желанию для любого пакета со случайным количеством сгенерированных очков для пользователя
  • Когда сумма подсчета достигает определенного числа (например: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...