блокировка ресурса из пула, позволяя другим заказывать другие ресурсы из пула ресурсов - PullRequest
1 голос
/ 13 июня 2011

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

update ResourceTable SET SOMEFIELD='1'

, но если первая транзакция еще не завершилась и теперь другой пользователь ищет (используя

select * FROM ResourceTable WHERE SOMEFIELD!='1' LOCK IN SHARE MODE

,пользователь ожидает завершения 1-й транзакции (хотя есть и другие бесплатные ресурсы). Если я удалю LOCK IN SHARE MODE, я получу ресурс, который должен быть заблокирован.

Как разрешить нескольким пользователямупорядочить ресурсы без ожидания?

(хотя я как-то выбираю строки, которые не заблокированы -> не существуют в MYSQL)

1 Ответ

0 голосов
/ 26 сентября 2012

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

...