Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Резервирование таблицы за конкретным пользователем
 
 автор: Владимир55   (14.12.2012 в 15:01)   письмо автору
 
 

Результаты исполнения запроса пользователя заносятся во временную таблицу. Эта таблица незамедлительно (в этом же скрипте) обрабатывается РНР-функциями и результаты обработки заносятся во вторую служебную таблицу.

Вторая таблица тоже обрабатывается РНР-выражениями в этом же скрипте и результат выводится пользователю.

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

Есть ли какая-то функция, которая позволит при обращении к первой таблице заблокировать обе таблицы для обращения нового пользователя до тех пор, пока результат работы скрипта вцелом не будет выведен первому обратившемуся пользователю?

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

  Ответить  
 
 автор: Valick   (14.12.2012 в 16:07)   письмо автору
 
   для: Владимир55   (14.12.2012 в 15:01)
 

обрабатывается РНР-функциями
а весь функционал переложить на плечи СУРБД нет возможности?

  Ответить  
 
 автор: Владимир55   (14.12.2012 в 19:05)   письмо автору
 
   для: Valick   (14.12.2012 в 16:07)
 

весь функционал переложить на плечи СУРБД не получается. На РНР переложить можно, но очень нерационально.

  Ответить  
 
 автор: Valick   (14.12.2012 в 20:14)   письмо автору
 
   для: Владимир55   (14.12.2012 в 19:05)
 

что именно не получается сделать средствами СУРБД?
блокировка таблиц

  Ответить  
 
 автор: Владимир55   (14.12.2012 в 20:48)   письмо автору
 
   для: Valick   (14.12.2012 в 20:14)
 

-

  Ответить  
 
 автор: oradev   (14.12.2012 в 20:27)   письмо автору
 
   для: Владимир55   (14.12.2012 в 15:01)
 

Не очень понятно, зачем нужна временная таблица, почему нельзя запись производить сразу в одну таблицу, предварительно обработав все в одном скрипте ?

  Ответить  
 
 автор: Владимир55   (14.12.2012 в 20:49)   письмо автору
 
   для: oradev   (14.12.2012 в 20:27)
 

Общий алгоритм такой.

1. Запрос к основной базе данных. Это очень большая база, содержащая почти сто миллионов записей размером почти 100 Гб. Поэтому запрос к ней нет смысла полностью детализировать, ибо иначе выборка идет слишком долго. Эта база неизменяемая.

Полученный результат заносим в первую временную таблицу.

2. уточняющий запрос в созданную временную таблицу, результаты которого заносим во вторую временную таблицу. Получаем исходные данные для работы.

3. Логическая обработка результатов выборки из второй временной таблицы. Формирование третьей временной таблицы путем серии запросов ко второй таблице и к сторонним таблицам.

4. Вывод содержимого третьей временной таблицы пользователю.

Соответственно, используются SELECT, INSERT INTO и UPDATE.

Как тут сделать блокировку?
Если можно, пример.

  Ответить  
 
 автор: cheops   (14.12.2012 в 21:33)   письмо автору
 
   для: Владимир55   (14.12.2012 в 20:49)
 

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

  Ответить  
 
 автор: oradev   (14.12.2012 в 22:21)   письмо автору
 
   для: Владимир55   (14.12.2012 в 20:49)
 

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

  Ответить  
 
 автор: cheops   (14.12.2012 в 21:31)   письмо автору
 
   для: Владимир55   (14.12.2012 в 15:01)
 

Для решения данной задачи в MySQL существуют временные таблицы, которые можно создать при помощи запроса CREATE TEMPORARY TABLE - они принадлежат текущему сеансу и автоматически удаляются при разрыве соединения с сервером.

PS Не на всех хостингах достаточно прав доступа для создания временных таблиц, но если у вас выделенный сервер - это то, что вам требуется.
PPS У вас какой тип таблиц?

  Ответить  
 
 автор: Владимир55   (15.12.2012 в 13:08)   письмо автору
 
   для: cheops   (14.12.2012 в 21:31)
 

У вас какой тип таблиц?

Обычный, создается так:
<?php
        $query 
"CREATE TABLE filter_display
        (
            id         INT     (11) NOT NULL AUTO_INCREMENT,
            id_tovara  INT     (11),
            ntov_grupp INT     (11),
            text_grupp VARCHAR (200)  CHARACTER SET utf8,
            producer   VARCHAR (60) CHARACTER SET utf8,
            artikul    VARCHAR (40),
            name_tov   VARCHAR (200)  CHARACTER SET utf8,
               cena       INT     (6),
               kol        INT     (6),
            PRIMARY KEY(id)
        ) ENGINE=MyISAM CHARACTER SET utf8"
;


А идея с временными таблицами просто великолепна!

Хотя, действительно, как я выяснил, многие хостеры этого не разрешают, уж и не знаю почему. Однако UMIHOST позволяет и это.

  Ответить  
 
 автор: oradev   (15.12.2012 в 13:23)   письмо автору
 
   для: Владимир55   (15.12.2012 в 13:08)
 

А почему для решения данной задачи не применить ООП, с каждым пользователем будет инициирован объект класса фильт.

  Ответить  
 
 автор: oradev   (15.12.2012 в 13:24)   письмо автору
 
   для: Владимир55   (15.12.2012 в 13:08)
 

А почему для решения данной задачи не применить ООП, с каждым пользователем будет инициирован объект класса фильт. Подобное я делал когда писались GUI-приложения.

  Ответить  
 
 автор: Владимир55   (15.12.2012 в 13:33)   письмо автору
 
   для: oradev   (15.12.2012 в 13:24)
 

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

  Ответить  
 
 автор: Владимир55   (15.12.2012 в 13:35)   письмо автору
 
   для: Владимир55   (15.12.2012 в 13:08)
 

Правильно ли я понимаю, что для использования временных таблиц необходимо выполнять CREATE TEMPORARY TABLE непосредственно в том скрипте, где эти таблицы будут использованы?

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

  Ответить  
 
 автор: Valick   (15.12.2012 в 15:07)   письмо автору
 
   для: Владимир55   (15.12.2012 в 13:35)
 

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

  Ответить  
 
 автор: Владимир55   (15.12.2012 в 16:10)   письмо автору
 
   для: Valick   (15.12.2012 в 15:07)
 

Можете пояснить это примером?

Пусть есть две таблицы, tb_1 и tb_2. Как будет выглядеть такая система?

  Ответить  
 
 автор: Valick   (15.12.2012 в 17:06)   письмо автору
 
   для: Владимир55   (15.12.2012 в 16:10)
 

<?php
$ct
=mysql_connect($dblocation,$dbuser,$dbpasswd);
mysql_select_db($dbname,$ct);
$query="LOCK TABLES  tb_1 READ, tb_2 WRITE";
$res=mysql_query($query);
?>

там оказывается можно блокировать сразу несколько таблиц или даже все оптом
вот тут подробнее расписано

  Ответить  
 
 автор: Владимир55   (15.12.2012 в 17:27)   письмо автору
 
   для: Valick   (15.12.2012 в 17:06)
 

Спасибо!

Однако, это описание я и раньше читал, но оно от практики долековато.

Вот как в реальном скрипте сделать блокировку, чтобы записывать в первую таблицу только в том случае, если она при этом не используется в другом сеансе?
А потом в ней искать, но запретить чтение и запись из другого сеанса? И писать во вторую таблицу, запретив читать и писать из нее другим посетителям?

Ведь одной приведенной Вами директивы совершенно недостаточно!

  Ответить  
 
 автор: Valick   (15.12.2012 в 17:35)   письмо автору
 
   для: Владимир55   (15.12.2012 в 17:27)
 

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

  Ответить  
 
 автор: cheops   (15.12.2012 в 15:36)   письмо автору
 
   для: Владимир55   (15.12.2012 в 13:35)
 

1. Да.
2. Используйте операторы LOCK TABLES и UNLOCK TABLES, если это MyISAM или транзакции, если это InnoDB.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования