Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Общий подход при работе с зависимости от таблицы 
:(
    Опции темы
Akina
Дата 8.12.2016, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Цитата(maxipub @  8.12.2016,  14:28 Найти цитируемый пост)
 С MyISAM таких проблем нет. Примитивно, просто, но хорошо. 

Да не вопрос, делайте транзакции руками. Просто все проблемы типа "примитива по ссылке" - это итог заботливого раскладывания граблей там, где собираешься пройти. Кто мешал вместо ODKU использовать REPLACE? он, кстати, не делает дырок в PK, и триггеры емнип запускает правильно... 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 9.12.2016, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(Akina @  8.12.2016,  16:15 Найти цитируемый пост)
Кто мешал вместо ODKU использовать REPLACE?

Знал бы где упадешь...

Когда я расставлял грабли ODKU, все было вполне логично. Они схожи с REPLACE. Но разница все же есть. ODKU не замещает, а именно обновляет запись, со всеми вытекающими. А именно, это чуть быстрее, и не надо заботиться что где-то вылезет дефолтное значение, обновляется только то, что мы явно указали.

Я бы не против перейти на InnoDB. Но опыта с ней нет. Уверен, подобных подводных камней куча будет. А проект рабочий, большой, не для экспериментов.
PM MAIL   Вверх
maxipub
Дата 9.12.2016, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Иначе говоря, как можно знать о такой "баге" ODKU, если ты с ним не сталкивался, и не знаешь о нем?

Добавлено через 58 секунд
А опыта с InnoDB нет, и таких вот "не знаешь" будет на каждом шагу.

Буду тренироваться на кошках каких-нибудь новых небольших проектах.
PM MAIL   Вверх
maxipub
Дата 13.12.2016, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Akina, вот и приехали... smile 

Начал добавлять в код LOCK TABLES. Добавил в пару мест, тестирую, ошибки с алиасами... Заглянул еще раз в МАН... http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html

Блин, оказывается алиасы таблицы тоже надо блокировать? Что за ерунда??? Мы же блокируем таблицу, логичестки что и все ее алиасы должны быть блокированы, нет? smile 

А теперь вопросы:

1. Я использую алиасы в первую очередь для лучшей читаемости запросов (сокращаю длинные имена таблиц). Но никогда не использую алиасы в запросах, где только одна таблица. Теперь получается, если в блокировке используется и таблица по ее имени, и таблица с алиасом, то надо или переделывать все запросы под алиасы, или блокировать и таблицу, и алиас.

1.1. Akina, Вы писали что корректней сначала указывать WRITE, потом READ. А в таком случае надо указывать сначала таблицу, потом алиасы?

Код
LOCK TABLE my_super_table WRITE, my_super_table AS t WRITE;


Вот так?

1.2. А если получает так, что алиас используется в запросе на запись, а по имени таблицы запрос на чтение.

Код
LOCK TABLE my_super_table AS t WRITE, my_super_table READ;


Корректная такая последовательность?

2. В МАНе http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html Начиная от абзаца "You cannot refer to a locked table multiple times in a single query using the same name. Use aliases instead, and obtain a separate lock for the table and each alias:".

Насколько я понял, речь о том, что при блокировке таблицы, в запросе нельзя два раза обращаться к ней про одному имени? Пробовал выполнить INSERT INTO t SELECT * FROM t; без блокировки - выполняется. С блокировкой не хочет. Стремно.

3. И вот тут http://stackoverflow.com/questions/2010722...ing-not-working немного непонятно. У человека не работает запрос:

Код
LOCK TABLES db.schedule AS j_read READ;
SELECT * FROM db.schedule as j_read;
UNLOCK TABLES;


Решение очень странное, указывать в блокировке и таблицу, и алиас:

Код
LOCK TABLES db.schedule READ,db.schedule AS j_read READ;
SELECT * FROM db.schedule as j_read;
UNLOCK TABLES;


Пробовал на MyISAM - работает. Ради интереса на InnoDB - так же работает. Мне кажется, чувак там что-то путает, да?

Это сообщение отредактировал(а) maxipub - 13.12.2016, 13:46
PM MAIL   Вверх
Akina
Дата 13.12.2016, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Цитата(maxipub @  13.12.2016,  14:44 Найти цитируемый пост)
оказывается алиасы таблицы тоже надо блокировать? Что за ерунда??? Мы же блокируем таблицу, логичестки что и все ее алиасы должны быть блокированы, нет?

Да, должны. Ну вот такая реализация.
Цитата(maxipub @  13.12.2016,  14:44 Найти цитируемый пост)
Но никогда не использую алиасы в запросах, где только одна таблица. Теперь получается, если в блокировке используется и таблица по ее имени, и таблица с алиасом, то надо или переделывать все запросы под алиасы, или блокировать и таблицу, и алиас.

какие проблемы? заблочил без алиаса, выполнил однотабличный запрос, переблочил с алиасом. выполнил многотабличный запрос, переблочил ещё раз...
Цитата(maxipub @  13.12.2016,  14:44 Найти цитируемый пост)
Корректная такая последовательность?

Да, конечно. Это даже в мануале есть.
Цитата(maxipub @  13.12.2016,  14:44 Найти цитируемый пост)
Решение очень странное, указывать в блокировке и таблицу, и алиас:

Тут нет ничего странного. Представь, что информация о блокировании помещается в таблицу:
Код

CREATE TABLE locks (
tablename,
alias default tablename,
locktype,
primary index (alias)
);



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 13.12.2016, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



4. Хотелось бы еще уточнить, это нормальная ситуация, когда ставится блокировка по таблице на запись, а по алиасу нам достаточно чтения?

4.1. Что будет в таком случае, если в блокировке сначала идет чтение, а потом запись. Мы прочитаем старые значения, после чего запишем новые?

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

Я конечно же провел эксперименты. Запросы выполняются в такой последовательности, в какой они указаны. Но хотелось бы узнать, все же до конца ли корректно такое мое трактование результатов. Возможно, какие-то особенности еще есть с этим?

Добавлено через 5 минут и 3 секунды
Цитата(Akina @  13.12.2016,  14:52 Найти цитируемый пост)
Тут нет ничего странного. Представь, что информация о блокировании помещается в таблицу:

Так и не понял, почему ничего странного. smile

Цитата(maxipub @  13.12.2016,  13:44 Найти цитируемый пост)
робовал на MyISAM - работает. Ради интереса на InnoDB - так же работает. Мне кажется, чувак там что-то путает, да?

Возможно не совсем понятно написал. Это относится как раз к исходному варианту, который у человека якобы не работал, т.е.:

Код
LOCK TABLES db.schedule AS j_read READ;
SELECT * FROM db.schedule as j_read;
UNLOCK TABLES;


У меня без проблем работает, и на MyISAM, и на InnoDB? smile И не вижу причин, почему этот код не должен корректно работать. Блокируем таблицу только по алаису, по имени таблицы не блокируем. Но по имени мы к ней в запросах и не обращается, что не так? smile

Добавлено через 6 минут и 36 секунд
Цитата(Akina @  13.12.2016,  14:52 Найти цитируемый пост)
какие проблемы? заблочил без алиаса, выполнил однотабличный запрос, переблочил с алиасом. выполнил многотабличный запрос, переблочил ещё раз...

Но если мне надо в рамках одной блокировки по логике требуется блокировать и без алиаса, и с алиасом - это нормальная практика, проблем не будет?

Или лучше переделывать все запросы на алиасы?
PM MAIL   Вверх
Akina
Дата 13.12.2016, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



4-4.1-4.2. Чё за ерунда? какая связь между блокировкой и выполняемой операцией?

Цитата(maxipub @  13.12.2016,  16:09 Найти цитируемый пост)
если мне надо в рамках одной блокировки по логике требуется блокировать и без алиаса, и с алиасом - это нормальная практика, проблем не будет?

Это просто два независимых блокирования. Под ними можно использовать таблицу ни разу, один раз или два раза.
И ещё - имя таблицы одновременно есть и её алиас. Так что не "с алиасом и без алиаса", а в любом случае дав алиаса. Просто один совпадает с именем таблицы (а также - существует всегда и не может быть удалён или переопределён).


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 14.12.2016, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(Akina @  13.12.2016,  21:13 Найти цитируемый пост)
4-4.1-4.2. Чё за ерунда? какая связь между блокировкой и выполняемой операцией?

Самому интересно. smile

Немного переспав с этой мыслью, и еще после Вашего напоминания что имя таблицы одновременно и есть ее алиасом. Походу начал понимать суть происходящего. Видимо на уровне движка СУБД блокировка происходит не физически по таблице, а по алиасам. Когда есть блокировка, движок пускает к заблокированным алаисам (и только к ним) "хозяина" блокировки, а всех остальных пускает только к не заблокированным (и только к ним) таблицам. Ну, конечно, с учетом типа блокировки.

Просто вчера мне было не понятно, как можно блокировать одну и ту же таблицу в рамках одной блокировки и на чтение, и на запись... Но если на уровне движка блокировка выполняется по алиасу, то все ясно и понятно. smile 
PM MAIL   Вверх
Akina
Дата 14.12.2016, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Цитата(maxipub @  14.12.2016,  11:53 Найти цитируемый пост)
на уровне движка СУБД блокировка происходит не физически по таблице, а по алиасам.

Не блокировка, а УЧЁТ блокировок.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1464 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.