Сколько времени истекает транзакция MySQL - PullRequest
2 голосов
/ 19 июня 2010

Как долго может длиться транзакция MySQL, пока не истечет время ожидания?Я спрашиваю, потому что я планирую закодировать процесс оплаты для моего проекта электронной коммерции где-то в соответствии с этим (псевдо-код PHP / MySQL):

START TRANSACTION;

SELECT...WHERE id IN (1,2,3) AND available = 1 FOR UPDATE; //lock rows where "available" is true

//Do payment processing...

//add to database, commit or rollback based on payment results

Я не могу думать о другомспособ блокировки покупаемых товаров (так что если два пользователя покупают его одновременно, а на складе остался только один, один пользователь не сможет купить), обработайте платеж, если товары доступны, и создайте записьпо результатам платежа ...

Ответы [ 3 ]

1 голос
/ 19 июня 2010

Эта техника также блокирует пользователей, которые просто хотят увидеть продукты, которые покупают другие люди.Я бы с особой осторожностью относился к любой технике, которая основывается на блокировке строк базы данных для обеспечения управления запасами.

Вместо этого, почему бы просто не записать количество элементов, связанных в настоящее время в активной «транзакции» (здесь имеется в виду более широкийкоммерческий смысл, а не технический смысл базы данных).Если у вас есть поле current_inventory, добавьте поле on_hold или being_paid_for или not_really_available_because_they_are_being_used_elsewhere, которое вы можете обновить с информацией о текущих платежах.

Еще лучше, почему бы не использовать журнал покупок / платежейдля суммирования элементов, находящихся в данный момент «в ожидании» или «в обработке» для нескольких разных пользователей.

Это общий подход, который вы часто видите на сайтах, таких как Ticketmaster, которые заявляют: «У вас есть X минут, чтобы закончить эту страницу,или мы вернем эти билеты обратно на рынок ".Они записывают, какие предметы пользователь сейчас пытается купить, и эти записи могут сохраняться даже при запросах страниц PHP.

0 голосов
/ 19 июня 2010

Если вам нужно спросить, сколько времени пройдет до истечения времени ожидания соединения с базой данных, тогда ваши транзакции будут принимать слишком длинные порядки.

Длинные открытые транзакции являются большой проблемой и частыми причинами низкой производительности, неповторимых ошибок или даже тупиковой блокировки всего приложения. Конечно, в веб-приложении вам нужны жесткие быстрые транзакции, чтобы гарантировать, что все блокировки на уровне таблиц и строк будут быстро освобождены.

Я обнаружил, что даже несколько 100 мс могут стать неприятными.

Тогда возникает проблема разделения транзакции по нескольким запросам, которые могут происходить одновременно.

Если вам нужно «эмулировать» длительные транзакции, нарежьте их на более мелкие части, которые можно быстро выполнить, и сохраните журнал, чтобы можно было выполнить откат с использованием журнала, отменив транзакции.

Теперь, если платежный сервис завершается в 98% случаев менее чем за 2 секунды, и у вас нет сотен одновременных запросов, это может быть просто нормально.

0 голосов
/ 19 июня 2010

Время ожидания зависит от настроек сервера - как для mysql, так и для языка, который вы используете для взаимодействия с mysql.Посмотрите в файлах настроек вашего сервера.

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

В целом, как заметил другой человек, мне не нравится идея блокирования целых строк таблицы, из которых вы, возможно, захотите выбрать другие.цели, выходящие за рамки фактического шага «покупки», так как это может привести к проблемам или узким местам в других местах вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...