Допустим на сервере есть файлы index.php и example.php;
Есть БД с таблицей users (полями id и coins);
(Первый пользователь)
В файле index.php мы с помощью SQL запроса получаем по id текущее состояние монет coins в переменную $curr_coins;
Потом в этом же файле есть цикл, который занимает скажем секунд 10;
После цикла выполняется запрос на UPDATE таблицы users (по тому же id), необходимо увеличить поле coins на определенную сумму (допустим на 500 единиц): я беру переменную $curr_coins и прибавляю к ней 500, после чего обновляю новое значение в строке;
(Второй пользователь)
Параллельно с этим всем другой пользователь запускает example.php;
Так совпадает что пока у первого пользователя крутится цикл (10 секунд), второй пользователь изменяет его состояние монет coins;
В теории получится что в строку будут занесены данные, отличные от тех, где мы добавляли 500 и обновляли строку (потому что "настоящее" значение $curr_coins будет другим);
да, ты прав чтобы решить проблему, можно использовать что-то вроде транзакции можно сделать вручную, например, в виде отдельного столбца блокировки, выставляемого в начале серии запросов и убираемого в конце, а можно средствами СУБД последнее, разумеется, предпочтительнее
update `coins_table` SET `coins` = 500 + (select `coins` FROM `coins_table` WHERE `user` = 4) WHERE `user` = 4 Или второй раз запрашивай с сервера количество прямо перед апдейтом и ставь лок на таблицу/строку (если это можно сделать в твоей БД), чтобы никто ничего не поменял, пока будешь апдейтить. Или все изменения клади в очередь и пусть в фоне работает один единственный обработчик этой очереди.