SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.03.2013 12:56:07

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Равномерное обновления данных по рассписанию из файл

Подскажите, пожалуйста, нужно обновлять данные по расписанию из xml. xml файлов получается очень много и данных очень много. Поэтому, чтобы не грузит сервер, и не допустить падения я загружаю данные постепенно. Скажем читаю через каждые 24 часа по 10 файлов за сессию, когда пользователь открывает страницу.
При этом есть база с колонками названий файлов и временем

table_file.file_name и table_file.date

Также есть таблица с самими данными в которой хранятся данные и также название файла

table2.file_name

Я делаю запрос на получение первых 10 файлов, которые еще не обновлялись

select * table_file from date='$date' limit10

затем в цикле удаляю все данные из table2.file_name равным table_file.file_name через delete и в том же цикле считываю файлы, и заношу обновленные данные через insert Into

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


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#2 02.03.2013 14:40:16

invisible73
Участник
Зарегистрирован: 18.02.2013
Сообщений: 2

Re: Равномерное обновления данных по рассписанию из файл

А что мешает все эти действия через крон сделать?

http://ru.wikipedia.org/wiki/Cron

Неактивен

 

#3 02.03.2013 14:58:55

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

Там обычный хостинг, без доступа даже к конфигурационным файлам Php, mysql


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#4 02.03.2013 15:08:44

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Равномерное обновления данных по рассписанию из файл

Задачи cron часто бывают доступны через панель хостинга

Неактивен

 

#5 02.03.2013 15:24:27

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

А на уровне mysql нельзя такое сделать? Задача еще в том, чтобы дать доступ к данным нескольким людям на уровне php-скрипта, т.е. закинул файл, создал базу, и оно обновляет время от времени

Отредактированно platedz (02.03.2013 15:28:04)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#6 02.03.2013 15:28:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Равномерное обновления данных по рассписанию из файл

Чтобы избежать одновременного доступа используйте блокировки: http://webew.ru/articles/1383.webew

В MySQL, начиная с версии 5.1 есть EVENT SCHEDULER http://dev.mysql.com/doc/refman/5.1/en/events.html

Неактивен

 

#7 02.03.2013 22:58:16

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

Большое спасибо за ответ, сейчас буду разбираться. Будьте добры, подскажите еще, а как можно удалить дубли скажем по 2-3 полям


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#8 02.03.2013 23:38:52

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

Почитал про блокировку, но, честно говоря не очень разобрался

Вот у меня запрос



$result = mysql_query(" select file_name  from table_file where date='$date' limit10 ");

while($fetch_array = mysql_fetch_array($result))
    {
        mysql_query("delete from table2 where file_name='".$fatch_array['file_name']."' ");
       
        $file = file_get_contents("путь к файлу");

        тут фунция разбора файла
       
        while(условия в соответствии с разбором файлм) mysql_query(" insert into table2 set .....");

        mysql_query("update table_file set `date`='".$date."+24' where file_name='".$fetch_array['file_name']."' ");
       
    }
 


Как, куда и что мне вставить, чтобы пока запрос выполняется, все пользователи могли читать данные, но изменять данные в других сессиях было нельзя (те.е. delete, update, insert), пока не выполнится этот запрос. Т.е. мне видимо нужно заблокировать на запись (удаление, изменение), таблицы table_file и table2 вначале цикла и разблокировать по окончанию.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#9 03.03.2013 15:31:29

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

Подскажите, правильно ли я понял.
команда

Read

разрешает для текущей сессии
запись, обновление, вставку, удаление

запрещает для других сессий
запись, обновление и удаление

разрешает для других сессий
чтение


write

разрешает для текущей сессии
запись, обновление, вставку удаление

и запрещает все это для других сессий.

Отредактированно platedz (03.03.2013 15:43:44)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#10 03.03.2013 15:51:28

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Равномерное обновления данных по рассписанию из файл

read разрешает текущей сессии читать, а другим запрещает писать
write разрешает текущей сессии чиать и писать, а другим запрещает и чтение и запись

Неактивен

 

#11 03.03.2013 15:57:10

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

read разрешает читать текущей сессии
Так а писать то она разрешает или запрещает текущей сессии?


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#12 03.03.2013 16:09:15

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Равномерное обновления данных по рассписанию из файл

писать запрещает всем, в том числе и текущей сессии
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

Неактивен

 

#13 03.03.2013 16:18:52

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

С английским у меня не очень, но вот здесь написано
http://веб-информ.рф/mysql/LOCK_TABLES.html

Различие между READ LOCAL и READ состоит в том, что READ LOCAL позволяет выполнять неконфликтующие команды INSERT во время существования блокировки. Однако эту команду нельзя использовать для работы с файлами базы данных вне сервера MySQL во время данной блокировки.

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

Отредактированно platedz (03.03.2013 16:19:37)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#14 03.03.2013 16:23:17

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Равномерное обновления данных по рассписанию из файл

mysql> create table x (id int);
Query OK, 0 rows affected (0.06 sec)
mysql> LOCK TABLES x READ;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO x VALUES (1);
ERROR 1099 (HY000): Table 'x' was locked with a READ lock and can't be updated
 


Такой блокировки, как вы описываете не бывает

Неактивен

 

#15 03.03.2013 18:06:47

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

Подскажите, а как можно из консоли windows открыть еще одну сессию с еще одним пользователем, чтобы потренироваться


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#16 03.03.2013 18:13:48

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Равномерное обновления данных по рассписанию из файл

запустить вторую консоль и в ней подключиться

Неактивен

 

#17 03.03.2013 19:05:05

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

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

Правильно ли я понимаю. Из консоли-то это кажется очевидным, а вот при работе сайта как-то не очень?


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#18 03.03.2013 19:08:28

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Равномерное обновления данных по рассписанию из файл

Точно. Все запросы будут ждать пока не освободится блокировка. Если истечет таймаут для скриптов php, то они прекратятся по таймауту недождавшись.

Неактивен

 

#19 03.03.2013 19:11:41

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

Большое спасибо за ответы. В целом думаю, что это не шибко страшно, т.ч. вполне можно и так реализовать.

Еще остался один вопрос, если не сложно.

Чем же все-таки отличается READ LOCAL от READ?


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#20 03.03.2013 19:21:53

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Равномерное обновления данных по рассписанию из файл

READ LOCAL работает только в MyISAM и позволяет дописывать в конец таблицы, если в ней нет щелей http://dev.mysql.com/doc/refman/5.0/en/ … serts.html

Неактивен

 

#21 03.03.2013 19:28:57

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

Спасибо за ответ. Сейчас попробую еще вариант с оптимизацией.

По поводу LOW_PRIORITY WRITE, еще не очень ясно

LOW_PRIORITY WRITE — блокирует таблицу для записи, но во время ожидания блокировки пропускает тех клиентов, которые стоят в очереди на получения блокировки типа READ. Во время ожидания блокировки, новые поступающие запросы на блокировку типа READ также пропускаются вперед, что может потенциально привести к тому, что запись не будет произведена никогда (если всегда есть клиенты в очереди на чтение).

Как понять, во время ожидания блокировки пропускает вперед тех клиентов, которые стоят в очереди на получение блокировки типа read?


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#22 03.03.2013 22:25:30

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

И еще такой вопрос возник, если у меня скажем подряд несколько write стоит, как это будет в отношении других соединений?

Клиент открывает страницу, я делаю блок write, обновляю данные,
а в это время другой клиент также открывает файл, и соответственно он тоже должен запустить write и обновить данные. Что  происходит в таком случае?

Получается вот несколько клиентов в очереди на ожидание.

write тоже ставится в очередь на ожидание?

И когда таких клиентов несколько, как получается, они по очереди друг за другом будут обновлять данные? Т.е. одна сессия заблокировала, отработала, разблокировала. Пошла вторая сессия, заблокировала, отработала, разблокировала и тд. ?

Отредактированно platedz (03.03.2013 23:08:25)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#23 03.03.2013 23:14:03

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Равномерное обновления данных по рассписанию из файл

В общем-то видимо да. При попытке выполнить какие-либо действия в сторону заблокированной таблицы любые дальнейшие запросы уже невозможны получается.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson