mysql 2.0.27, кластер, хранилище NDB.Решил проверить, работает ли SELECT FOR UPDATE.
Подключаюсь к БД с двух консолек, в одной делаю:
SELECT * FROM table FOR UPDATE;
По идее это должно залочить все выбранные строки до последующего UPDATE с этого же соединения.
В другой делаю:
SELECT * FROM table;
И вижу содержимое таблицы.Вопрос: это я туплю или в mysql опять сделали интерфейс, а реализацию еще не успели?
А вообще задача такая: надо сделать так, чтобы клиенты не могли одновременно выбрать с помощью SELECT одни и те же данные. Т.е. клиент выбирает строку, обрабатывает ее и делает ей UPDATE. И чтоб при этом они не кидались одновременно на одну и ту же строку. Может есть другой путь помимо SELECT FOR UPDATE? Построчная блокировка не устраивает, так как SELECT на самом деле выбирает несколько строк и блокировать их вручную слишком медленно.
>Подключаюсь к БД с двух консолек, в одной делаю:
>SELECT * FROM table FOR UPDATE;
>По идее это должно залочить все выбранные строки до последующего UPDATE с
>этого же соединения.
>В другой делаю:
>SELECT * FROM table;
>И вижу содержимое таблицы.а разве SELECT FOR UPDATE должен блокировать возможность селектить? или все-таки он блокирует возможность АПДЕЙТИТЬ?!
\^P^/
>а разве SELECT FOR UPDATE должен блокировать возможность селектить? или все-таки он
>блокирует возможность АПДЕЙТИТЬ?!Я так понял, что он блокирует строку для записи (lock for write), т.е. не дает ни читать, ни писать из другого потока, пока вызвавший его поток не завершит транзакцию.
Я чего-то не понял?P.S. Объясните пожалуйста разницу между SELECT ... FOR UPDATE и SELECT ... LOCK IN SHARE MODE. В мануале ничего не понял :(
Тут еще в процессе возник вопрос. Кто-нибудь знает, хранимые процедуры выполняются атомарно или нет? А то может блокировки вообще не нужны, просто нужные запросы упаковать в процедуру?
>[оверквотинг удален]
>Вопрос: это я туплю или в mysql опять сделали интерфейс, а реализацию
>еще не успели?
>
>А вообще задача такая: надо сделать так, чтобы клиенты не могли одновременно
>выбрать с помощью SELECT одни и те же данные. Т.е. клиент
>выбирает строку, обрабатывает ее и делает ей UPDATE. И чтоб при
>этом они не кидались одновременно на одну и ту же строку.
>Может есть другой путь помимо SELECT FOR UPDATE? Построчная блокировка не
>устраивает, так как SELECT на самом деле выбирает несколько строк и
>блокировать их вручную слишком медленно.select for update блокирует другой select for update если данные пересекаются, ну и конечно блокирует update и delete этих строк