Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: insert и update в одном запросе
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » insert и update в одном запросе

Страниц (1): [1]
 

1. BlackHacker - 06 Апреля, 2013 - 20:51:02 - перейти к сообщению
Привет всем. Долго гуглил, но решения найти не смог. Да и язык MySql знаю не слишком хорошо. Хотелось бы составить такой запрос, который выберет запись из базы, и одновременно обновит данные в ней (нужно получить данные для работы с ними, и пометить эту строку в таблице как заблокированную, чтобы другой пользователь не смог получить к ней доступ, пока эти данные используются другим пользователем). Заранее спасибо за помощь.
2. LIME - 06 Апреля, 2013 - 22:01:29 - перейти к сообщению
в одном запросе не получится так как при инсерте и апдейте таблица блокируется(либо затронутая строка, зависит от движка) и селект невозможен
это ответ и на второй вопрос
3. BlackHacker - 07 Апреля, 2013 - 05:56:06 - перейти к сообщению
Тогда придется делать два запроса. А велика ли вероятность, что пока выполнился первый запрос Select, но еще не выполнился второй запрос Update, другой пользователь может получить эти данные в этот промежуток времени между запросами? (если конечно нагрузка на сайт будет большая)
4. _Dark_ - 07 Апреля, 2013 - 08:08:15 - перейти к сообщению
Выборка данных это SELECT, а не INSERT.
Выполняйте два запроса, насчет этого промежутка вообще не беспокойтесь, он невероятно мал (если, конечно, у вас все в порядке с производительностью). Я не располагаю точными данными, но если, допустим, эта задержка составит 30 миллисекунд (а она по идее гораздо меньше), то посещаемость вашего сайта должна быть 33 пользователя в секунду, чтобы была возможность попасть в этот промежуток времени.
5. Мелкий - 07 Апреля, 2013 - 10:24:40 - перейти к сообщению
_Dark_ пишет:
посещаемость вашего сайта должна быть 33 пользователя в секунду

По нынешним меркам называться хайлоадом - это обрабатывать больше 150 страниц в секунду. Т.е. запросто угодить в интервал между запросами.

LIME пишет:
(либо затронутая строка, зависит от движка) и селект невозможен

И опять же зависит от движка.
innoDB чтению не мешает. MVCC, пока апдейтится запись, другие читают предыдущую версию данных.

BlackHacker пишет:
пока выполнился первый запрос Select, но еще не выполнился второй запрос Update

Используйте select for update http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]cking-reads[dot]html

 

Powered by ExBB FM 1.0 RC1