|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.08.2016, 23:57 | #21 |
Форумчанин
Регистрация: 01.08.2016
Сообщений: 182
|
1. SELECT ... FOR UPDATE работает только на таблицах InnoDB(транзакционных), на Memory - не поддерживается.
2. Странно, что у вас отработал второй скрипт для теста InnoDB. У вас там два SELECT-а подряд, второй не должен выполниться, пока запись не разблокируется по UPDATE. |
18.08.2016, 19:09 | #22 | |
Форумчанин
Регистрация: 17.02.2014
Сообщений: 881
|
Цитата:
Добавил: Код:
Код:
Хм.... Тогда я совсем запутался. Я хотел чтобы во время работы всего скрипта другой скрипт не смог вклинится между SQL запросами данного скрипта. Т.е. заблокировать строку для вызова на все действия ( и на чтение и на update) А если мемори то всю таблицу так хотел заблокировать на время выполнения данного скрипта, точнее в тестовом на время выполнения одной итерации. А уже в реальном скрипте на время выполнения этого реального скрипта Но получается что я блокирую этой инструкцией и нужное мне действие в самом скрипте... И как же нужно делать тогда? Последний раз редактировалось Illusiony; 18.08.2016 в 19:24. |
|
18.08.2016, 19:16 | #23 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Одного select мало? Второй зачем?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
18.08.2016, 20:05 | #24 |
Форумчанин
Регистрация: 17.02.2014
Сообщений: 881
|
|
18.08.2016, 23:42 | #25 |
Форумчанин
Регистрация: 01.08.2016
Сообщений: 182
|
А расскажите чуть подробнее, что вы хотите сделать. Возможно, всё можно сделать гораздо проще.
Что мне удалось понять: 1. Приложение обращается к серверу и присылает координату str_click для пользователя с идентификатором $member 2. если в таблице нет записи для $member - то создаётся новая запись $member + str_click. 3. если запись есть - то надо выгрести старое значение str_click и на его место записать новое. При этом, старое значение str_click посылается в приложение? Или используется ещё каким-то образом? Зачем оно вообще нужно? Продолжает ли приложение присылать новые str_click если не получит от сервера значение старого? Возможно, у вас архитектура такая, что не будет проблем с thread safe (когда между 2мя отдельными запросами к mysql в скрипте может произойти другой запрос из другого скрипта и тем самым испортить логику?) И что делает второе приложение, какие ему данные нужны из этой таблицы? Последний раз редактировалось predefined; 19.08.2016 в 00:04. |
20.08.2016, 17:59 | #26 |
Форумчанин
Регистрация: 17.02.2014
Сообщений: 881
|
Сейчас версия такая:
- есть 2 программы, пускай под номером 1 и 2. - таблица innoDB с полем login ( это для идентификации каждой пары 2х программ) и str_click в которое в текстовом виде Пример: [234]{456}(е) [1234]{324}(r)[234]{456}(l) хранятся координаты кликов и способ клика ( ПКМ,ЛКМ или какая то другая команда) - 1 программа должна посылать команды( координаты) новых кликов, если они есть с частотой не чаще 1 раза в секунду ( реализовано посылка сразу нескольких кликов, если их частота составляет быстрее 1 раза в секунду) Эта программа находит строку с нужным login ом, и дописывает в конец поля str_click новые координаты. При этом до этого в поле str_click может и не быть ничего. - программа 2 с частотой около 1 раза в 1-2 секунды считывает str_click делает что ей нужно ( реализует отработку кликов в чужой программе) и стирает это поле. Эти 2 программы нахотятся на разных компах. Наверное, вероятность того, что один скрипт вклинится своим Mysql запросом между запросами другого скрипта, невероятная, при частоте около 1 раза в секунду обращений 2х программ? и ненужно ничего городить? Допустим меня тревожат такая ситуация: - вторая программ считывает str_click , а первая в после этого дописала в эту строку еще новые данные, после этого вторая программа все сотрет. Ну и подобные возможные коллизии в логике. Последний раз редактировалось Illusiony; 20.08.2016 в 18:23. |
20.08.2016, 18:55 | #27 |
Форумчанин
Регистрация: 01.08.2016
Сообщений: 182
|
Вам не надо ничего городить. Делаете таблицу:
PHP код:
При получении данных от Приложения 1 последовательно делаете записи в таблицу: INSERT `admin_bd_avtopick` SET `str_click`='$str_click', `unix_time`='$timestamp', `member`='$member' Приложение 2 выгребает записи, пока они есть: SELECT `str_click`, `unix_time` FROM `admin_bd_avtopick` WHERE `member`='$member' ORDER BY `unix_time` ASC в порядке возрастания unix_time (что пришло раньше - выгребается первее) Обработанные строки убираете по: DELETE FROM `admin_bd_avtopick` WHERE `unix_time`='$timestamp' $timestamp для записи в поле `unix_time` можно генерить на сервере перед записью, НО ПРАВИЛЬНЕЕ, если его будет присылать ваше Приложение 1 вместе с str_click. Тогда, если следующий пакет придёт раньше предыдущего(предыдущий может дропнуться по дороге и тогда будет отправлен заново) - очерёдность выборки Приложением 2 нарушена не будет. Или, по крайней мере Приложение 2 сможет узнать о нарушении очерёдности, сравнив `unix_time` с предыдущим. И можно ничего не мутить с "реализацией посылки сразу нескольких кликов, если их частота составляет быстрее 1 раза в секунду". В случае чего, очередь будет сделана операционной системой при приёме TCP/IP пакетов, и вторая - на MySQL если он не будет успевать за вашим скриптом. Но, если хотите присылать сразу строку из нескольких кликов - скриптом разбиваете строку в массив(по разделителю) и пишете в цикле каждый в отдельную строку таблицы MySQL. Последний раз редактировалось predefined; 20.08.2016 в 19:06. |
20.08.2016, 19:13 | #28 |
Форумчанин
Регистрация: 17.02.2014
Сообщений: 881
|
Так я собирался делать по 1 записи в таблице на 1 связку 2х программ. А тут будет черт знает что( . Там кроме этих данных в этой таблице есть еще поля, которые нужны для работы других задач и несколько строк( записей) принадлежащих к одной связке программ мне попросту мозг вынесет.
А посылка сразу нескольких кликов , если чаще 1 раза в секунду сделано для уменьшения количества запросов. Ведь я предполагаю до 100+ одновременно работающих связок. Последний раз редактировалось Illusiony; 20.08.2016 в 19:18. |
21.08.2016, 13:08 | #29 |
Форумчанин
Регистрация: 01.08.2016
Сообщений: 182
|
А почему не хотите для обмена данными между приложениями завести отдельную таблицу?
Добавьте в неё поле-идентификатор "связки программ", по которому она будет связана с основной таблицей. Можно даже все 100+ "связок" запихать в эту отдельную таблицу, это совсем не много. У меня 4 связанных таблицы работают, 1.5 миллиона строк - не вопрос, в среднем 2 запроса в сек сыпется. Трафик обрабатывается, поэтому днём может быть по 20-100 запросов в сек, а ночью - "копейки". Последний раз редактировалось predefined; 21.08.2016 в 13:15. |
21.08.2016, 14:12 | #30 | |
Форумчанин
Регистрация: 17.02.2014
Сообщений: 881
|
Цитата:
при обращении к одной таблице за 1 запрос select ( и не только select) можно одновременно взять дополнительные данные, нужные мне для других целей. А, если делать другую таблицу, то нужен дополнительный запрос к уже другой таблице. Проще архитектура и меньше дополнительных запросов. Я понимаю, что наверняка, можно сделать сложный запрос сразу к 2м таблицам. Но я не силен в Mysql , впрочем, как и во всем. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Написать программу, с помощью которой изображение будет разбиваться по пикселям и будет создаваться матрица | andrey4515 | Помощь студентам | 2 | 08.01.2014 18:44 |
Будет ли сервер idTCP работать без веделенного внешнего ip (Delphi Indy) | _PROGRAMM_ | Помощь студентам | 1 | 29.11.2010 13:52 |
какая структура *.icns?? | Ntlegend | Общие вопросы Delphi | 3 | 02.09.2009 01:24 |
Учет оплаты. Какая формула будет если..? | Anton_audit | Microsoft Office Excel | 5 | 12.08.2009 17:40 |
посчитать какая доставка для клинта 10-я? Delphi (Клиент-Сервер) | Vindigo | Помощь студентам | 6 | 27.01.2008 15:28 |