Я разработал сайт, показывающий книги в аренду, используя php и mySQL. Когда кто-то нажимает на книгу, отображается информационная страница с таймером обратного отсчета, и у пользователя есть 10 секунд, чтобы решить, хочет ли он одолжить ее. Если время истекло, пользователь должен вернуться и снова щелкнуть книгу, чтобы отобразить «страницу заимствования». Когда пользователь нажимает на книгу, PHP сначала проверяет, просматривает ли кто-нибудь книгу в данный момент. Если его никто не просматривает, PHP отобразит «страницу заимствования», и пользователь получит 10сек эксклюзивности для книги. В течение этих 10 секунд другие пользователи не смогут открыть страницу или просмотреть «кнопку заимствования». Все работает и работает, за исключением того, что я не знаю, как это сделать правильно, поэтому только один пользователь может сначала получить 10-секундную эксклюзивность. Моя логика такова:
Таблица MySQL:
Книга (book_ID, title, current_user, expire_time)
а. Когда пользователь нажимает на книгу: PHP Проверьте, если expire_time
б. Если истина (предыдущее время просмотра истекло), установите в поле current_user идентификатор пользователя запрашивающей стороны и установите время истечения сейчас + 10 секунд:
UPDATE Book SET current_user = '$ userID', expire_time = ADDTIME (NOW (), '00: 00: 10 ')
с. Если false (все еще в пределах времени просмотра), дополнительно проверьте, равно ли поле current_user идентификатору пользователя запрашивающей стороны.
д. если true, отобразить «страницу заимствования».
е. если false, выведите сообщение об ошибке «кто-то еще просматривает книгу. Пожалуйста, вернитесь через 10 секунд»
Я тестировал одновременное нажатие на книгу на двух компьютерах. В большинстве случаев только один компьютер может получить доступ к странице и получить эксклюзивность в течение 10 секунд. Однако было одно время, когда оба компьютера успешно открывали страницу «заимствовать книгу» одновременно. Это определенно не то, что я хочу. Представьте, что существует 100 веб-запросов с просьбой открыть одну и ту же книгу, и половина из них проходит, пока есть только одна книга, доступная для аренды.
Книги заимствованы только для иллюстрации. Что я хочу знать, так это то, что когда на сервер MySQL одновременно поступает множество запросов, как получить или выбрать первый запрос, а остальное приостановить?