Вопрос по MySQL ...

putomkov
На сайте с 18.11.2011
Offline
129
610

В коде PHP выполняется два SQL запроса

-----------------------------------------

Первый запрос SELECT table1...

....

код PHP

...

Второй запрос INSERT table1...

-----------------------------------------

Как гарантированно сделать так чтобы пока выполнялся php-код между select и insert, второй пользователь не повторил эту операцию...

Например:

два пользователя одновременно открыли страницу и одновременно выполнили SELECT, т.е получили однаковые данные, а потом получается два раза в таблицу вставляются одни и те-же данные.

т.е. происходит логическая ошибка в моей задаче

а должно быть так, первый пользователь выполнил select ... insert а потом второй выполняет select ... insert итд третий четверый пятый ....т.е. по очереди

ДП
На сайте с 23.11.2009
Offline
203
#1

LOCK TABLE?

SX
На сайте с 15.07.2008
Offline
79
#2

а если по времени долго выполняется - LOCKать?

я предложил бы...

создать поле в table1 либо доп таблицу

и в нем держать учётку...

т.е.

select table1

update table1 либо insert table2 либо создать файл ...

php код

insert table1

update table1 либо delete table2 либо удалить файл...

нужно также учесть, что возможно PHP код вылетит в Fatal error :)

всё зависит от задачи...

Sly32
На сайте с 29.03.2012
Offline
303
#3

каждый пользователь будет в своей сессии. Каждый инсерт вставит новую строку... в чем проблема? Не хотите дублей - делайте проверку на уникальность записей.

eis
На сайте с 18.10.2008
Offline
473
eis
#4
putomkov:
а потом получается два раза в таблицу вставляются одни и те-же данные.

Напишите, что за данные записываете в таблицу.

- Здесь я покупаю вечные ссылки на свои сайты! (https://backlinkator.com) - сотни ссылок за копейки
siv1987
На сайте с 02.04.2009
Offline
427
#5
SpaceX:
я предложил бы...
создать поле в table1 либо доп таблицу

Я честно говоря не понял, и в чем смысл, что помешает, внести одинаковые данные? Или запросил - удалил? Но ведь запросить в теории они могут одновременно...

Уникальность можно проверить и на уровне mysql, поставьте UNIQUE KEY для уникального поле записи

SX
На сайте с 15.07.2008
Offline
79
#6

siv1987, возможно есть задания... и они должны выполняться по очереди разными пользователями... т.е. если одному дали, чтоб второму не дать (помечаем так сказать те строки которые обрабатываются)...

также перед записью проверять а нет ли того что хотим записать...

надо оценивать вероятность одновременных запросов...

например при регистрации пользователя проверяю нет ли такого в БД - только потом записываю... и не использую UNIQUE KEY

возможно мой косяк, есть куда расти :)

S
На сайте с 23.05.2004
Offline
316
#7

START TRANSACTION;

... всякие запросы в базу

COMMIT;

Это просто подпись.
VHS
На сайте с 28.09.2007
Offline
142
VHS
#8

Для начала уточните тип таблицы.

Далее или локать или запускать транзакцию.

Основное - понять потенциальную нагрузку на данный участок кода, чтобы не собирать длинных очередей на транзакции. Ну и оптимизировать, чтобы обработка одного действия была минимальной. Тут надо оптимально подойти в первую очередь к структуре таблицы и данных, ключам, настройкам сервера, чтобы время и на вставку и на селект было минимально возможным.

Если это не высоконагруженный проект - можно забить на это дело и просто локать или запускать транзакцию.

iqmaker
На сайте с 17.04.2012
Offline
309
#9

Вероятно вам нужен SELECT FOR UPDATE

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

что-то вроде:


SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;
VHS
На сайте с 28.09.2007
Offline
142
VHS
#10

Да разницы нет особой, главное чтобы Innodb был тип

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий