Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
Есть таблица InnoDB. В ней есть поле money. Необходимо, чтобы к этому полю в каждый момент времени имел доступ только один поток, причем другой поток не мог даже прочитать его значение. То есть если в данный момент идет работа с какой-либо строкой, то при доступе к ней другого потока возвращалось бы значение, что строка занята.
Идеальным вариантом было бы использование функций GET_LOCK(), IS_FREE_LOCK() и RELEASE_LOCK(), но они работают не так, как я ожидал. Пример: есть два скрипта, в одном стоит SELECT GET_LOCK('qqq', 60), во втором SELECT IS_FREE_LOCK('qqq'). При запуске второго после запуска первого IS_FREE_LOCK показывает, что блокировка не поставлена. Может быть я неправильно работаю с этими функциями? Или они действительно предназначены для использования в рамках одного скрипта?
Транзакции наверно не подходят, так как следующая транзакция будет ожидать завершение предыдущей, а потом выполняться, но как раз последующего выполнения и не нужно.
Может быть есть какие-то другие варианты?
Неактивен
Все установленные локи освобождаются при завершении соединения с MySQL. Если первый клиент получил лок и завершил работу, то лок сбросится и будет такая картина, как вы описали.
Неактивен
rgbeast
Спасибо! Точно, поставил задержку в первом скрипте, второй показывает, что блокировка сделана.
Неактивен