обновить оператор с предложением where на текущее значение - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь выполнить оператор обновления, чтобы обновить баланс в моей таблице базы данных.Эта таблица просто хранит userId и currentBalance.Я использую mysql с InnoDB.

Я думал, что запрос типа -

update account a set a.BALANCE= a.BALANCE + WITHDRAW_AMOUNT where a.USER_ID = ?2 and a.BALANCE + WITHDRAW_AMOUNT > 0

Этот запрос предназначен для ввода или вывода денег (в случае снятия нетто-остаток не долженпадение ниже 0)

Если, скажем, у меня есть пользователь с идентификатором 2. Его текущий баланс составляет 500. При этом одновременно поступают 2 запроса на снятие денег -

Требование 1 - 300

Треб. 2 - 400

Теперь я думал, что, когда строки выбираются для обновления с использованием условия где, это может произойти одновременно?Из того, что я понимаю сейчас, выполнение оператора обновления получает блокировку строк.

Если да, то, скажем, Req1 получает блокировку для пользователя с идентификатором 2, и Req2 переходит в ожидание этих строк.Тогда наш баланс будет обновлен до 200.

Теперь баланс равен 200, поэтому Req 2 выполнится, потому что строки были выбраны, или нет, потому что весь оператор выполняется снова для Req 2 и предложения where.возвращает false, поскольку WITHDRAW_AMOUNT + баланс <0 сейчас? </p>

...