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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: одновременное обновление

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
AterCattus
Отправлено: 24 Августа, 2009 - 19:12:00
Post Id



Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Янв. 2008  
Откуда: Санкт-Петербург


Помог: 0 раз(а)




Вечер добрый. Обращаюсь за мнением в правильности (ошибочности) решения.
Требуется обновление таблицы с выборкой ключа обновленной записи (в общем случае группы записей). Из-за множества одновременных запросов необходим контроль. Сделал как в примере ниже, правильно ли?

CODE (text):
скопировать код в буфер обмена
  1. START TRANSACTION;
  2. SET AUTOCOMMIT=0;
  3. LOCK TABLES `table` WRITE;
  4. SELECT id FROM `table` WHERE state="d" LIMIT 1;
  5. UPDATE `table` SET state="p" WHERE id = #id;
  6. UNLOCK TABLES;
  7. COMMIT;


Есть ли необходимость в локе таблицы?
 
 Top
EuGen Администратор
Отправлено: 25 Августа, 2009 - 01:10:05
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




AterCattus пишет:
#
SELECT id FROM `table` WHERE state="d" LIMIT 1;
#
UPDATE `table` SET state="p" WHERE id = #id;

А чем не устроил вариант
CODE (text):
скопировать код в буфер обмена
  1.  
  2. UPDATE  `table` SET state="p" WHERE state="d" LIMIT 1
  3.  

?
Транзакция описана верно, только не нужно забывать про то, что:
- Storage engine = InnoDB
- Делать откат в случае, если обновление не удалось (ROLLBACK)
- Нет необходимости совершать транзакцию с целью разграничения, если Вы уже используете блокировку.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
AterCattus
Отправлено: 25 Августа, 2009 - 11:34:10
Post Id



Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Янв. 2008  
Откуда: Санкт-Петербург


Помог: 0 раз(а)




Цитата:
А чем не устроил вариант

Мне нужно получить ключи (ну и другие поля, какие - не принципиально) измененных записей. И в реальности LIMIT будет больше 1. А UPDATE возвращает лишь число измененных записей.

Мне важна атомарность обновления state и получения ключей. Тут либо LOCK таблицы, либо транзакция, но в ней в данном случае я не уверен.

Про InnoDB и ROLLBACK я и не говорю - это понятно.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB