Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2016, 23:57   #21
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

1. SELECT ... FOR UPDATE работает только на таблицах InnoDB(транзакционных), на Memory - не поддерживается.

2. Странно, что у вас отработал второй скрипт для теста InnoDB. У вас там два SELECT-а подряд, второй не должен выполниться, пока запись не разблокируется по UPDATE.
predefined вне форума Ответить с цитированием
Старый 18.08.2016, 19:09   #22
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от predefined Посмотреть сообщение
1. SELECT ... FOR UPDATE работает только на таблицах InnoDB(транзакционных), на Memory - не поддерживается.

2. Странно, что у вас отработал второй скрипт для теста InnoDB. У вас там два SELECT-а подряд, второй не должен выполниться, пока запись не разблокируется по UPDATE.
Да вы видимо правы. Я проверил только то что в записях значение этого поле действительно изменилось.

Добавил:
Код:
$sql = mysqli_query($link,"SELECT str_click FROM $table FOR UPDATE WHERE n= '$nember' "); // блокируем поле от изменений
if ($sql) {
			} else {
				
			echo "не вставили1".mysqli_error($link);
			}
$sql = mysqli_query($link,"SELECT str_click FROM $table WHERE n= '$nember' "); //
if ($sql) {
			} else {
				
			echo "не вставили2".mysqli_error($link);
			}
В итоге:
Код:
не вставили1You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE n= '3'' at line 1
Ну и для вариантов с WHERE n= '2' и WHERE n= '1' соответственно.

Хм.... Тогда я совсем запутался.
Я хотел чтобы во время работы всего скрипта другой скрипт не смог вклинится между SQL запросами данного скрипта. Т.е. заблокировать строку для вызова на все действия ( и на чтение и на update)
А если мемори то всю таблицу так хотел заблокировать на время выполнения данного скрипта, точнее в тестовом на время выполнения одной итерации. А уже в реальном скрипте на время выполнения этого реального скрипта

Но получается что я блокирую этой инструкцией и нужное мне действие в самом скрипте...
И как же нужно делать тогда?

Последний раз редактировалось Illusiony; 18.08.2016 в 19:24.
Illusiony вне форума Ответить с цитированием
Старый 18.08.2016, 19:16   #23
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Одного select мало? Второй зачем?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.08.2016, 20:05   #24
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Одного select мало? Второй зачем?
Ясно, понял. А на счет остального?
Illusiony вне форума Ответить с цитированием
Старый 18.08.2016, 23:42   #25
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Цитата:
Сообщение от Illusiony Посмотреть сообщение
И как же нужно делать тогда?
А расскажите чуть подробнее, что вы хотите сделать. Возможно, всё можно сделать гораздо проще.


Что мне удалось понять:

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.
predefined вне форума Ответить с цитированием
Старый 20.08.2016, 17:59   #26
Illusiony
Форумчанин
 
Регистрация: 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.
Illusiony вне форума Ответить с цитированием
Старый 20.08.2016, 18:55   #27
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Вам не надо ничего городить. Делаете таблицу:
PHP код:
CREATE  TABLE IF NOT EXISTS `admin_bd_avtopick`.`HSCrab_test3`  (
  `
unix_timeTIMESTAMP(14NOT NULL,
  `
str_clickVARCHAR(120NOT NULL,
  `
memberINTEGER UNSIGNED NOT NULL,
  ) 
Поле unix_time TIMESTAMP нужно чтобы отличать порядок прихода записей. Вместо него можно сделать и ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, но оно рано или поздно переполнится.

При получении данных от Приложения 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.
predefined вне форума Ответить с цитированием
Старый 20.08.2016, 19:13   #28
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Так я собирался делать по 1 записи в таблице на 1 связку 2х программ. А тут будет черт знает что( . Там кроме этих данных в этой таблице есть еще поля, которые нужны для работы других задач и несколько строк( записей) принадлежащих к одной связке программ мне попросту мозг вынесет.
А посылка сразу нескольких кликов , если чаще 1 раза в секунду сделано для уменьшения количества запросов. Ведь я предполагаю до 100+ одновременно работающих связок.

Последний раз редактировалось Illusiony; 20.08.2016 в 19:18.
Illusiony вне форума Ответить с цитированием
Старый 21.08.2016, 13:08   #29
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

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

Можно даже все 100+ "связок" запихать в эту отдельную таблицу, это совсем не много. У меня 4 связанных таблицы работают, 1.5 миллиона строк - не вопрос, в среднем 2 запроса в сек сыпется. Трафик обрабатывается, поэтому днём может быть по 20-100 запросов в сек, а ночью - "копейки".

Последний раз редактировалось predefined; 21.08.2016 в 13:15.
predefined вне форума Ответить с цитированием
Старый 21.08.2016, 14:12   #30
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от predefined Посмотреть сообщение
А почему не хотите для обмена данными между приложениями завести отдельную таблицу?
Добавьте в неё поле-идентификатор "связки программ", по которому она будет связана с основной таблицей.

Можно даже все 100+ "связок" запихать в эту отдельную таблицу, это совсем не много. У меня 4 связанных таблицы работают, 1.5 миллиона строк - не вопрос, в среднем 2 запроса в сек сыпется. Трафик обрабатывается, поэтому днём может быть по 20-100 запросов в сек, а ночью - "копейки".
Я так думаю из-за соображения:
при обращении к одной таблице за 1 запрос select ( и не только select) можно одновременно взять дополнительные данные, нужные мне для других целей. А, если делать другую таблицу, то нужен дополнительный запрос к уже другой таблице. Проще архитектура и меньше дополнительных запросов. Я понимаю, что наверняка, можно сделать сложный запрос сразу к 2м таблицам. Но я не силен в Mysql , впрочем, как и во всем.
Illusiony вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, с помощью которой изображение будет разбиваться по пикселям и будет создаваться матрица 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