4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
|
||||||
Не работает транзакция22.01.2025, 16:38. Показов 568. Ответов 14
Добрый день! Случилась такая история. Есть код
0
|
22.01.2025, 16:38 | |
Ответы с готовыми решениями:
14
Не работает транзакция Не работает транзакция Не работает транзакция MySQL |
Native x86
![]() ![]() 6450 / 3553 / 994
Регистрация: 13.02.2013
Сообщений: 11,265
|
|
22.01.2025, 19:26 | |
БД какая? Не все базы (и не все движки в некоторых базах) поддерживают транзакции.
0
|
Native x86
![]() ![]() 6450 / 3553 / 994
Регистрация: 13.02.2013
Сообщений: 11,265
|
|
23.01.2025, 17:57 | |
Он-то транзакции поддерживает, но вы как-то не правильно представляете себе работу серверных скриптов.
"Подвисание интернета" на работу PHP-скрипта влияет весьма опосредственно. Не прервется скрипт мгновенно при пропадании связи с клиентом. На "осознание" проблемы сетевому стеку нужно как минимум несколько секунд (или даже десятков секунд). Причем это время должно пройти пока открыта транзакция. В коде у вас все выглядит правильно, но проблема скорее всего в другом месте.
0
|
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
|
||||||
23.01.2025, 18:12 [ТС] | ||||||
Оператор вносит в кассу сумму. Инет подвис. Видимо (мое предположение)она не дождалась статус что данные внесены или статус обо ошибке. Она несколько раз жмет кнопку сохранить . Потом инет отвисает. В таблице касса появляется несколько одинаковых записей. А в таблице клиент баланс клиента не обновился
Добавлено через 3 минуты При нажатии кнопки сохранить должно появляться сообщение что данные внесены и модальное окно закрывается. но оно не закрылось и сообщения об ошибке не появилось и что данные не сохранены не было сообщения. С этим файлом работает 10 операторов и только у одного случилось это за все время работы. сейчас я сделал логирование операций но это тоже не защитит от глюков, наверное.
создал логирование ....
0
|
Невнимательный
![]() |
|||||||||||
23.01.2025, 18:32 | |||||||||||
gena8208, как-то можно проверить влияет-ли ?
какое-то добавление, а потом скрипт просто завершает работу... без COMMIT/ROLLBACK изначально вроде так и было реализовано Не по теме: Как вариант ещё попробовать COMMIT и ROLLBACK в функции где-то реализовать, и зарегистрировать её с
но тоже костыль, и передавать/получать кучу всего... объект pdo, перевменную какую насчёт всё-ли выполнено
1
|
![]() 3886 / 3226 / 1351
Регистрация: 01.08.2012
Сообщений: 10,878
|
|
23.01.2025, 18:36 | |
Надо дебажить, что именно подвисает. Если база - по какой причине? Может не хватает кол-ва одновременных подключений или каких ресурсов.
Вообще в скрипте есть стандартная проблема, о которой любят спрашивать на собесах - отсутствие обработки конкурентного доступа. Запускаем скрипт одновременно несколько раз - и каждая транзакция будет параллельно выполнять SELECT + INSERT + UPDATE несмотря на другие транзакции. В итоге UPDATE по сути сработает только один (последний), он перезапишет результат предыдущих апдейтов. Условно, у юзера баланс 100 рублей. Запускается 2 транзакции, каждая на списание 70 рублей. Каждая видит, что у юзера баланс 100, исходя из этого оформляет покупку и обновляет баланс на 30р. В итоге оформилось 2 заказа суммарно на 140р, а у юзера списалось только 70. Для решения проблемы используем блокирующее чтение, т.е. SELECT ... FOR UPDATE. Думаю в вашем случае это вполне может быть оно, т.к. подвисает база, и после отвисания срабатывают сразу несколько транзакций, ожидающих выполнения.
1
|
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
|
|
23.01.2025, 20:48 [ТС] | |
База лежит на хостинге рег.ру. Может и у них с сервером проблема. ИИ подсказывает что надо передать переменные на сервер а там производить транзакцию с помощью хранимой процедуры или делать тригеры и проверять операция завершена или нет и еще можно логировать статус операции ... вариантов много, но мне понравился вариант передать переменные на сервер а там производить транзакцию с помощью хранимой процедуры Ведь под самой базой а не через php транзакция либо пройдет либо откатится. Возможно я ошибаюсь. Не настолько спец. Всем спасибо буду думать. Если есть мысли, буду рад ознакомиться
Добавлено через 1 минуту про это тоже инфу поищу. Добавлено через 4 минуты Да именно об этом писал ИИ но другими словами. Отличная информация, познавательная. Спасибо
0
|
![]() 2481 / 1406 / 665
Регистрация: 23.08.2015
Сообщений: 3,545
|
|
23.01.2025, 22:15 | |
1) Запуск одновременно несколько операций над одной записью лучше не допускать, чтоб как раз избегать таких плавающих ошибок... Для этого нужно делать блокировки.
2) Операция должна быть идемпотентна. Чтоб если вы запускали несколько раз одну и туже операцию - в итоге получили один результат, как будто бы выполнили эту операцию один раз. Для этого и необходим ключ идемпотентности. У вас оба пункта не выполнены. Вот тут проблема. Если параллельно запустить несколько операций, то начальный остаток будет одинаков и последняя транзакция затрет баланс. Тут и еще такой подход, что теоретически данные могут разойтись, хорошо когда их можно актуализировать т.е. пересчитать баланс.
0
|
![]() 3886 / 3226 / 1351
Регистрация: 01.08.2012
Сообщений: 10,878
|
|
23.01.2025, 23:12 | |
Если это виртуальный хостинг, а не VPS/VDS, то подвисания - норма, т.к. провайдеры обычно не гарантируют постоянный доступ к выделенным ресурсам.
Это не решит проблему. Под PHP она точно также либо пройдёт, либо откатится, в этом смысл транзакций. Выполняются они ведь также в СУБД. Думается, вы грешите на PHP, дескать он плохо с транзакциями работает. Но нет, проблема архитектурная, а PHP всё делает как надо, просто при множественных запросах вы не видите, как один UPDATE запрос перекрывается другим.
0
|
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
|
||||||
26.01.2025, 10:32 [ТС] | ||||||
С одной записью работает один оператор. Если сделать так, например, когда оператор нажал кнопку сохранить то кнопка сохранить становится неактивной, чтобы транзакция прошла успешно или выдала ошибку что операция не выполнена? Или это не правильный подход?
Я это предполагаю. При первом нажатии не было сообщения об успехе или ошибка поскольку инет подвис. Они начали нажимать несколько раз. В итоге первая транзакция не прошла а остальные прошли и баланс несколько раз изменился. Самый простой способ я думаю блокировать кнопку сохранения после первого клика пока транзакция не пройдет успешно или выдаст ошибку. МОжет глупо конечно Добавлено через 31 секунду Да именно виртуальный хостинг Добавлено через 5 минут Да именно так я и думал)). Сейчас логирую все транзакции чтобы хоть понять в какой момент что не внеслось и чтобы суммы не терялись. Это пока единичный случай был, но он был. И предполагать я этого не мог, т.к. в первые CRUD через сайт делал. Раньше писал проги на C# дял CRUD. Там проблем с этим не было Добавлено через 21 минуту ИИ подсказал такую вещь. При выполнении транзакции делать прорверку на изменение ячейки. Изменения произошли то транзакция успешна, иначе откат. Пример
0
|
Невнимательный
![]() |
|
26.01.2025, 11:10 | |
Сессии.
Когда для пользователя выполняется скрипт, который открыл сессию, файл сессии блокируется , и открытия сессии, с таким-же сид, ожидают разблокирования ... по завершению первого, или по выполнению из него session_write_close() или подобного . Также частоту выполнения можно ограничить, сохранением и проверкой времени успешного выполнения, касательно выполнения какого-либо действия конкретно.
0
|
![]() 3886 / 3226 / 1351
Регистрация: 01.08.2012
Сообщений: 10,878
|
|
26.01.2025, 13:44 | |
Но новые записи добавились, значит транзакции прошли.
Нормальное решение, чтобы юзер не мог спамить запросами. Только подозреваю, что проблему это не решит, т.к. есть подвисания, после которых могут начать выполняться сразу несколько запросов от разных операторов. ИИ предложил дичь. Проблема типовая и её решение тоже типовое - SELECT ... FOR UPDATE, благодаря чему транзакции будут отрабатывать поочерёдно, не перекрывая друг друга. Больше тут ничего не требуется.
0
|
26.01.2025, 13:44 | ||||||
Помогаю со студенческими работами здесь
15
транзакция Транзакция Транзакция
Транзакция Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи
![]() |
||||
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
|
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 02.04.2025
Из ответов LM модели.
Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
|
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка:
«Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
|
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
|
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
|
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
|
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
|
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
|
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
|
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
|