Я все еще смущен о блокировке строки таблицы. Я использую MySQL/PHP, и вот мой сценарий.Блокировка уровня строки - MySQL - для обновления
У меня есть набор таблиц, которые мое приложение использует для отслеживания запросов и сообщений. Пользователь создает проводку (таблица POSTING (P)) для элемента (таблица ITEM (I)) и может отправлять запросы отдельным пользователям (таблица REQUEST (R)) или может публиковать их и получать ответные сообщения (таблица POSTING_RESPONSE (PR)), которые будут приниматься пользователем.
Пример: Я являюсь пользователем с велосипедом. Я отправляю его, а также отправляю запросы отдельным пользователям. Пользователи, которые получают запрос от меня, могут принимать/отклонять/или ничего не делать. Если они принимают - это зарезервировано. Другие пользователи могут найти мое сообщение и «подать заявку» на предмет. У меня есть возможность «принять» или «игнорировать» их запрос. Если я принимаю, элемент зарезервирован.
То, что я хочу делать, если кто-то принимает запрос:
блокировки строки в пункте (I) таблица, соответствующая статья
блокировки строки в POSTING (P) таблицы (если строка существует) соответствующий элементу
блокировки строки (ы) в запросе таблицы (R), для любых запросов, отправляемых на пункт
блокировки строки (ы) В POSTING_RESPONSE (PR) таблицы (если есть строки), соответствующий пункту
обновления статуса ITEM в 'зарезервировано'
обновление статуса POSTING к 'Недоступен'
обновление все/любой POSTING_RESPONSE к «Отклонено»
обновление всех ЗАПРОС на «Отклонено», кроме того, что принято - обновление, что один на «принято»
Игнорируйте избыточность статуса с помощью этого примера, пожалуйста.
Теперь я предположил, что # 1 - 4 можно сделать с помощью простого «select ... для обновления», оставив AUTOCOMMIT как false. Я мог бы избавиться от этих утверждений select, нужно ли мне обновлять или нет, и если да, я могу продолжить обновления. Затем, после завершения обновлений # 5-8, я бы зафиксировал и строки были бы разблокированы.
У меня проблемы с работой, и я не знаю, связано ли это с чем-то, что я делаю, или мое мышление неверно.
Еще одна вещь ... есть другие процессы, которые могут обновлять статус элемента, скажем, EXPIRED или CANCELED. Я надеюсь, что единственное решение моего подхода - не поставить все возможные условия в предложение WHERE в операторах UPDATE ... это не будет легко поддерживать.
Обычно SELECT являются считанными, которые не являются блокирующими. Чтобы заблокировать SELECT, вы должны указать [блокировки чтения] (http://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads.html) –
@JayBlanchard, можете ли вы объяснить? Может быть, я просто толстый, но я посмотрел на ваш рефери до и из того, что я собрал, есть только два варианта: LOCK IN SHARE MODE - который не будет препятствовать чтению - и FOR UPDATE - вот что показывает мой пример выше , FOR UPDATE не работает в моем примере выше? Если нет, что это должно быть? – NEW2WEB
Нет, я просто пропустил это чтение. Что не работает для вас? –