php + mysql. Лок через Select for update совсем не помогает
ванга умерла давно уже
Извиняюсь за наглость, а какой код ты хочешь увидеть? Потому что я говорю о банальном селект/апдейт, где у одного пользователя снимается баланс и начисляется другому
Может например какой драйвер используешь?
гугли транзакции и уровни изоляции
Я с таблицами не очень хорошо знаком. Знаю только движок, Innodb, а драйвер не понимаю что это
Там и нагуглил select for update, только ничего не получается у меня
не хранить баланс как значение. хранить вместо него транзации и вычислять баланс как совокупность транзакций
Но ведь тогда я все равно сделаю селект баланса и в любом случае продублируется запрос
селект продублирется? не вижу ничего страшного пока
Как ничего? Вот прошло 2 одновременных запроса, каждый из них видит на моем балансе 1000, затем отправляет 2 раза по 1000
Я к тому что если много записей в журнале транзакций юзер не захочет ждать 5 секунд)
надо смотреть твой код. не ясно, какую именно проблему ты решаешь, и там ли она находится где ты думаешь
Я и не скидываю пример, потому что это просто селект баланса, затем апдейт баланса текущего пользователя и тому кому отправился баланс. 2 строчки
ну я и говорю, делай как бухгалтеры. транзакции можно только добавить в таблицу. в случае проблем ты не удаляешь запись, а добавляешь новую, компенсируя ошибку
Тогда все равно создаст 2 транзакции и баланс пользователя будет в минусе
1 таблица под транзакции, которая принимает только селект и инсерт. Она хранит историю ВСЕХ транзакций. По коду выглядит любая операция так: update "users" set "balance" = -5.00 where "id" = 555; insert into "transactions" ("userid", "state", "summ") values (555, 1, -5.00);
Спасибо что обратил внимание на проблему. А что мешает здесь выполнению двух одновременных запросов? Баланс пользователя все равно уйдет в минус и добавятся лишние записи в транзакции. Я сейчас продолжаю изучать транзакции и изоляции, это как я понял, единственный верный вариант
Так. Подожди. Почему баланс уйдёт в минус то?
Обсуждают сегодня