Я все еще не понимаю блокировку строк таблицы. Я использую MySQL/PHP, и вот мой сценарий.
У меня есть набор таблиц, которые мое приложение использует для отслеживания запросов и сообщений. Пользователь создает публикацию (таблица POSTING(P)) для элемента (таблица ITEM(I)) и может отправлять запросы отдельным пользователям (таблица REQUEST(R)) или может размещать ее и получать ответы на публикацию (таблица POSTING_RESPONSE(PR )) который будет принят пользователем, разместившим элемент.
Пример: я пользователь с велосипедом. Выкладываю - а также рассылаю запросы отдельным пользователям. Пользователи, получившие от меня запрос, могут принять/отклонить/или ничего не делать. Если примут - резервируется. Другие пользователи могут найти мою публикацию и подать заявку на товар. У меня есть возможность «принять» или «проигнорировать» их запрос. Если я принимаю, товар зарезервирован.
Что я хочу сделать, если кто-то примет запрос:
заблокировать строку в таблице ITEM (I), соответствующую элементу
заблокировать строку в таблице POSTING (P) (если строка существует), соответствующую элементу
заблокировать строку (строки) в таблице REQUEST (R) для любых запросов, отправленных для элемента
заблокировать строку (строки) в таблице POSTING_RESPONSE (PR) (если строки существуют), соответствующие элементу
обновить статус ПУНКТА на «Зарезервировано»
обновить статус POSTING на «Недоступно»
обновить все/любые POSTING_RESPONSE до «Отклонено»
обновить все ЗАПРОСЫ до «Отклонено», кроме того, который был принят — обновить его до «Принято»
Пожалуйста, не обращайте внимания на избыточность статуса в этом примере.
Теперь я предположил, что № 1–4 можно выполнить с помощью простого «выбрать ... для обновления», оставив AUTOCOMMIT как false. С помощью этих операторов select я мог определить, следует ли мне обновляться, и если да, то я могу продолжить обновления. Затем, после завершения обновлений № 5-8, я бы зафиксировал, и строки были бы разблокированы.
У меня проблемы с тем, чтобы заставить это работать, и я не знаю, связано ли это с чем-то, что я делаю, или с тем, что я неправильно думаю.
Еще одна вещь... есть другие процессы, которые могут обновить статус элемента, скажем, на ИСТЕКШИЙ или ОТМЕНЕННЫЙ. Я надеюсь, что единственное решение моего подхода состоит не в том, чтобы поместить каждое возможное условие в предложение WHERE в операторах UPDATE... это было бы нелегко поддерживать.