Здравствуйте. Не знаю как задать вопрос правильно, попробую описать на примере.
ПРИМЕР:
Есть простая таблица склада товара, 2 колонки [
ID товара,
количество товара].
Предположим на складе работники сканируют каждую единицу товара, и при этом счетчик склада товара уменьшается на 1 штуку.
Получается что при каждом скане, программа запрашивает у таблицы склада строку с ID товара. После чего, вычитает от остатка единицу, и обновляет строку в базе данных.
Простой пример для понимания.
Пример очень упроченный, на самом деле между получением остатка склада и сохранением нового,
происходит много действий, так же связанной с запросами к другим таблицам в базе, и это занимает какое то время.
balance = SELECT balance FROM warehouse WHERE product_id= 5
new_balance = balance - 1
UPDATE warehouse SET balance = new_balance WHERE product_id= 5
При тестах замечена ожидаемая проблема. Если одновременно много человек сканит товары, то остатки склада ломаются, так как при одновременно нескольких запросах, программа не успевает обновить остатки в базе данных, и несколько человек получает одинаковый баланс, минусует единицу, и сохраняет одно и тоже значение. Как с этим можно бороться? Может какие ни будь блокировки строки пока не будет выполнен комит? Или есть еще решения на такие случаи?
Пример очень упрощен, для того, что бы я смог объяснить в чем проблема. Сильно не придирайтесь. Я понимаю, что в данном примере можно сделать простой UPDATE без запроса остатка, но по факту все сложнее, и каждое сканирование товара, делает много запросов к базе, и сразу несколько изменений, и все в одном комите.
PS
Всем спасибо за ответы. Самое простое решение найдено, это посчитать на сколько нужно изменить склад, и сделать это простым запросом
UPDATE warehouse SET balance = balance - change_delta WHERE product_id= 5. Не знаю, почему это банально простое решение не пришло мне в голову. Таким образом пропадает вся конкуренция, и никаких проблем.
Я понимаю всех, кто говорит, что так делать не правильно, нужно в отдельной таблице записывать транзакции изменения. Но повторю еще раз, я хотел понять как сделать простой счетчик, и привел простой пример. Для ответственных вещей, так делать не правильно.