У меня есть таблица, которая должна получать много вставок из нескольких потоков. Не должно быть никакой вставки ни одним потоком после достижения определенной суммы.
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 или есть какая-то хитрость в рукаве, которую мне не хватает.
Большое спасибо в заранее!