URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6655
[ Назад ]

Исходное сообщение
"SELECT FOR UPDATE на NDB"

Отправлено Dip , 03-Авг-07 14:59 
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 FOR UPDATE на NDB"
Отправлено perece , 03-Авг-07 17:46 
>Подключаюсь к БД с двух консолек, в одной делаю:
>SELECT * FROM table FOR UPDATE;
>По идее это должно залочить все выбранные строки до последующего UPDATE с
>этого же соединения.
>В другой делаю:
>SELECT * FROM table;
>И вижу содержимое таблицы.

а разве SELECT FOR UPDATE должен блокировать возможность селектить? или все-таки он блокирует возможность АПДЕЙТИТЬ?!

\^P^/


"SELECT FOR UPDATE на NDB"
Отправлено Dip , 04-Авг-07 01:02 
>а разве SELECT FOR UPDATE должен блокировать возможность селектить? или все-таки он
>блокирует возможность АПДЕЙТИТЬ?!

Я так понял, что он блокирует строку для записи (lock for write), т.е. не дает ни читать, ни писать из другого потока, пока вызвавший его поток не завершит транзакцию.
Я чего-то не понял?

P.S. Объясните пожалуйста разницу между SELECT ... FOR UPDATE и SELECT ... LOCK IN SHARE MODE. В мануале ничего не понял :(


"SELECT FOR UPDATE на NDB"
Отправлено Dip , 04-Авг-07 02:07 
Тут еще в процессе возник вопрос. Кто-нибудь знает, хранимые процедуры выполняются атомарно или нет? А то может блокировки вообще не нужны, просто нужные запросы упаковать в процедуру?

"SELECT FOR UPDATE на NDB"
Отправлено tux2002 , 13-Авг-07 14:54 
>[оверквотинг удален]
>Вопрос: это я туплю или в mysql опять сделали интерфейс, а реализацию
>еще не успели?
>
>А вообще задача такая: надо сделать так, чтобы клиенты не могли одновременно
>выбрать с помощью SELECT одни и те же данные. Т.е. клиент
>выбирает строку, обрабатывает ее и делает ей UPDATE. И чтоб при
>этом они не кидались одновременно на одну и ту же строку.
>Может есть другой путь помимо SELECT FOR UPDATE? Построчная блокировка не
>устраивает, так как SELECT на самом деле выбирает несколько строк и
>блокировать их вручную слишком медленно.

select for update блокирует другой select for update если данные пересекаются, ну и конечно блокирует update и delete этих строк