Вставка в таблицу из нескольких потоков, но SUM ниже порога - PullRequest
0 голосов
/ 22 апреля 2020

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

BEGIN TRAN
    IF((SELECT SUM(Amount)FROM dbo.Transactions WHERE PlayerID=3)<100)
        INSERT INTO dbo.Transactions(PlayerID, Amount)
        SELECT 3, (ABS(CHECKSUM(NEWID()))% 14)/ 100.00;
COMMIT

Проблема заключается в том, что, когда несколько параллельных потоков достигают порога, они вставляют данные в таблицу параллельно, как и для суммы всех этих потоков ( сумма) меньше, чем 100. Это означает, что несколько строк вставляются одновременно, когда SUM (Сумма) составляет всего около 100. Это приносит SUM (Сумма) намного выше 100. Однако, это побеждает важные бизнес-логики c сохранения суммы меньше затем определенное количество, т. е. 100.

Я пытался использовать уровень изоляции SERIALIZABLE, но это вызвало столько взаимных блокировок, что это не похоже на решение по качеству производства. Я также попробовал SP_GetAppLock, но это было и медленнее.

Это ограничение SQL или есть какая-то хитрость в рукаве, которую мне не хватает.

Большое спасибо в заранее!

...