|
|
|
| Результаты исполнения запроса пользователя заносятся во временную таблицу. Эта таблица незамедлительно (в этом же скрипте) обрабатывается РНР-функциями и результаты обработки заносятся во вторую служебную таблицу.
Вторая таблица тоже обрабатывается РНР-выражениями в этом же скрипте и результат выводится пользователю.
При этом не исключена ситуация, что в момент работы скрипта какой-то другой пользователь тоже к нему обратится и тогда произойдет сбой в работе, поскольку таблицы являются общими.
Есть ли какая-то функция, которая позволит при обращении к первой таблице заблокировать обе таблицы для обращения нового пользователя до тех пор, пока результат работы скрипта вцелом не будет выведен первому обратившемуся пользователю?
(Исключить использование служебных таблиц хотя и возможно в принципе, но весьма нежелательно). | |
|
|
|
|
|
|
|
для: Владимир55
(14.12.2012 в 15:01)
| | обрабатывается РНР-функциями
а весь функционал переложить на плечи СУРБД нет возможности? | |
|
|
|
|
|
|
|
для: Valick
(14.12.2012 в 16:07)
| | весь функционал переложить на плечи СУРБД не получается. На РНР переложить можно, но очень нерационально. | |
|
|
|
|
|
|
|
для: Владимир55
(14.12.2012 в 19:05)
| | что именно не получается сделать средствами СУРБД?
блокировка таблиц | |
|
|
|
|
|
|
|
для: Valick
(14.12.2012 в 20:14)
| | - | |
|
|
|
|
|
|
|
для: Владимир55
(14.12.2012 в 15:01)
| | Не очень понятно, зачем нужна временная таблица, почему нельзя запись производить сразу в одну таблицу, предварительно обработав все в одном скрипте ? | |
|
|
|
|
|
|
|
для: oradev
(14.12.2012 в 20:27)
| | Общий алгоритм такой.
1. Запрос к основной базе данных. Это очень большая база, содержащая почти сто миллионов записей размером почти 100 Гб. Поэтому запрос к ней нет смысла полностью детализировать, ибо иначе выборка идет слишком долго. Эта база неизменяемая.
Полученный результат заносим в первую временную таблицу.
2. уточняющий запрос в созданную временную таблицу, результаты которого заносим во вторую временную таблицу. Получаем исходные данные для работы.
3. Логическая обработка результатов выборки из второй временной таблицы. Формирование третьей временной таблицы путем серии запросов ко второй таблице и к сторонним таблицам.
4. Вывод содержимого третьей временной таблицы пользователю.
Соответственно, используются SELECT, INSERT INTO и UPDATE.
Как тут сделать блокировку?
Если можно, пример. | |
|
|
|
|
|
|
|
для: Владимир55
(14.12.2012 в 20:49)
| | Блокировка заставит всех остальных пользователей ждать, когда таблица будет разблокирована, она вам точно нужна? | |
|
|
|
|
|
|
|
для: Владимир55
(14.12.2012 в 20:49)
| | Допустим, получается для каждого пользователя будет создана не одна а две виртуальные таблицы, это очень ресурсозатратно, все-таки я бы пересмотрел таблицу, создал бы необходимые индексы, возможно добавил бы какое-то уникальное поле для ускорения выборки. | |
|
|
|
|
|
|
|
для: Владимир55
(14.12.2012 в 15:01)
| | Для решения данной задачи в MySQL существуют временные таблицы, которые можно создать при помощи запроса CREATE TEMPORARY TABLE - они принадлежат текущему сеансу и автоматически удаляются при разрыве соединения с сервером.
PS Не на всех хостингах достаточно прав доступа для создания временных таблиц, но если у вас выделенный сервер - это то, что вам требуется.
PPS У вас какой тип таблиц? | |
|
|
|
|
|
|
|
для: 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 позволяет и это. | |
|
|
|
|
|
|
|
для: Владимир55
(15.12.2012 в 13:08)
| | А почему для решения данной задачи не применить ООП, с каждым пользователем будет инициирован объект класса фильт. | |
|
|
|
|
|
|
|
для: Владимир55
(15.12.2012 в 13:08)
| | А почему для решения данной задачи не применить ООП, с каждым пользователем будет инициирован объект класса фильт. Подобное я делал когда писались GUI-приложения. | |
|
|
|
|
|
|
|
для: oradev
(15.12.2012 в 13:24)
| | С ООП я уже наигрался - быстродействие падает жутко. На мой взгляд, ООП следует применять только там, где без него не обойтись. | |
|
|
|
|
|
|
|
для: Владимир55
(15.12.2012 в 13:08)
| | Правильно ли я понимаю, что для использования временных таблиц необходимо выполнять CREATE TEMPORARY TABLE непосредственно в том скрипте, где эти таблицы будут использованы?
И все же, для понимания: а как решить эту задачу с обычными таблицами, используя блокировку, заставляющую остальных посетителей ждать освобождения таблиц? | |
|
|
|
|
|
|
|
для: Владимир55
(15.12.2012 в 13:35)
| | с обычными просто устанавливаете два соединения и блокируете обе таблицы, если блокировка прошла успешно, то продолжаете работу, если нет, то принимаете решение ждать разблокировки нужной таблицы либо делаете отмену заблокированной и повторяете процедуру через интервал времени. | |
|
|
|
|
|
|
|
для: Valick
(15.12.2012 в 15:07)
| | Можете пояснить это примером?
Пусть есть две таблицы, tb_1 и tb_2. Как будет выглядеть такая система? | |
|
|
|
|
|
|
|
для: Владимир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);
?>
|
там оказывается можно блокировать сразу несколько таблиц или даже все оптом
вот тут подробнее расписано | |
|
|
|
|
|
|
|
для: Valick
(15.12.2012 в 17:06)
| | Спасибо!
Однако, это описание я и раньше читал, но оно от практики долековато.
Вот как в реальном скрипте сделать блокировку, чтобы записывать в первую таблицу только в том случае, если она при этом не используется в другом сеансе?
А потом в ней искать, но запретить чтение и запись из другого сеанса? И писать во вторую таблицу, запретив читать и писать из нее другим посетителям?
Ведь одной приведенной Вами директивы совершенно недостаточно! | |
|
|
|
|
|
|
|
для: Владимир55
(15.12.2012 в 17:27)
| | тогда не знаю, нужно испытывать в реальных условиях, я стараюсь строить логику так чтобы блокировка была не нужна.
кстати алиасы используются? блокировать нужно именно их всех, даже если к одной таблице их неслолько | |
|
|
|
|
|
|
|
для: Владимир55
(15.12.2012 в 13:35)
| | 1. Да.
2. Используйте операторы LOCK TABLES и UNLOCK TABLES, если это MyISAM или транзакции, если это InnoDB. | |
|
|
|