SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 31.10.2010 17:18:35

Pablo_M
Участник
Зарегистрирован: 31.10.2010
Сообщений: 2

Строчные блокировки в InnoDB

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

Неактивен

 

#2 31.10.2010 17:57:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Строчные блокировки в InnoDB

Все установленные локи освобождаются при завершении соединения с MySQL. Если первый клиент получил лок и завершил работу, то лок сбросится и будет такая картина, как вы описали.

Неактивен

 

#3 31.10.2010 20:00:51

Pablo_M
Участник
Зарегистрирован: 31.10.2010
Сообщений: 2

Re: Строчные блокировки в InnoDB

rgbeast
Спасибо! Точно, поставил задержку в первом скрипте, второй показывает, что блокировка сделана.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson