|
Модераторы: skyboy |
|
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 453 |
Да не вопрос, делайте транзакции руками. Просто все проблемы типа "примитива по ссылке" - это итог заботливого раскладывания граблей там, где собираешься пройти. Кто мешал вместо ODKU использовать REPLACE? он, кстати, не делает дырок в PK, и триггеры емнип запускает правильно... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
maxipub |
|
|||
Опытный Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Знал бы где упадешь... Когда я расставлял грабли ODKU, все было вполне логично. Они схожи с REPLACE. Но разница все же есть. ODKU не замещает, а именно обновляет запись, со всеми вытекающими. А именно, это чуть быстрее, и не надо заботиться что где-то вылезет дефолтное значение, обновляется только то, что мы явно указали. Я бы не против перейти на InnoDB. Но опыта с ней нет. Уверен, подобных подводных камней куча будет. А проект рабочий, большой, не для экспериментов. |
|||
|
||||
maxipub |
|
|||
Опытный Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Иначе говоря, как можно знать о такой "баге" ODKU, если ты с ним не сталкивался, и не знаешь о нем?
Добавлено через 58 секунд А опыта с InnoDB нет, и таких вот "не знаешь" будет на каждом шагу. Буду тренироваться на кошках каких-нибудь новых небольших проектах. |
|||
|
||||
maxipub |
|
||||||||
Опытный Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Akina, вот и приехали...
Начал добавлять в код LOCK TABLES. Добавил в пару мест, тестирую, ошибки с алиасами... Заглянул еще раз в МАН... http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html Блин, оказывается алиасы таблицы тоже надо блокировать? Что за ерунда??? Мы же блокируем таблицу, логичестки что и все ее алиасы должны быть блокированы, нет? А теперь вопросы: 1. Я использую алиасы в первую очередь для лучшей читаемости запросов (сокращаю длинные имена таблиц). Но никогда не использую алиасы в запросах, где только одна таблица. Теперь получается, если в блокировке используется и таблица по ее имени, и таблица с алиасом, то надо или переделывать все запросы под алиасы, или блокировать и таблицу, и алиас. 1.1. Akina, Вы писали что корректней сначала указывать WRITE, потом READ. А в таком случае надо указывать сначала таблицу, потом алиасы?
Вот так? 1.2. А если получает так, что алиас используется в запросе на запись, а по имени таблицы запрос на чтение.
Корректная такая последовательность? 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 немного непонятно. У человека не работает запрос:
Решение очень странное, указывать в блокировке и таблицу, и алиас:
Пробовал на MyISAM - работает. Ради интереса на InnoDB - так же работает. Мне кажется, чувак там что-то путает, да? Это сообщение отредактировал(а) maxipub - 13.12.2016, 13:46 |
||||||||
|
|||||||||
Akina |
|
||||||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 453 |
Да, должны. Ну вот такая реализация. какие проблемы? заблочил без алиаса, выполнил однотабличный запрос, переблочил с алиасом. выполнил многотабличный запрос, переблочил ещё раз... Да, конечно. Это даже в мануале есть.
Тут нет ничего странного. Представь, что информация о блокировании помещается в таблицу:
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||||
|
|||||||
maxipub |
|
||||||||
Опытный Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
4. Хотелось бы еще уточнить, это нормальная ситуация, когда ставится блокировка по таблице на запись, а по алиасу нам достаточно чтения?
4.1. Что будет в таком случае, если в блокировке сначала идет чтение, а потом запись. Мы прочитаем старые значения, после чего запишем новые? 4.2. А если сначала запись, а потом чтение??? С одной стороны, блокировка на чтение должна блокировать изменения таблицы. С другой стороны, блокировка на запись имеет приоритет перед блокировкой на чтение. Просто не совсем понятно, как эти две разные блокировки по сути одной таблицы будут уживаться друг с другом? Я конечно же провел эксперименты. Запросы выполняются в такой последовательности, в какой они указаны. Но хотелось бы узнать, все же до конца ли корректно такое мое трактование результатов. Возможно, какие-то особенности еще есть с этим? Добавлено через 5 минут и 3 секунды
Так и не понял, почему ничего странного.
Возможно не совсем понятно написал. Это относится как раз к исходному варианту, который у человека якобы не работал, т.е.:
У меня без проблем работает, и на MyISAM, и на InnoDB? И не вижу причин, почему этот код не должен корректно работать. Блокируем таблицу только по алаису, по имени таблицы не блокируем. Но по имени мы к ней в запросах и не обращается, что не так? Добавлено через 6 минут и 36 секунд
Но если мне надо в рамках одной блокировки по логике требуется блокировать и без алиаса, и с алиасом - это нормальная практика, проблем не будет? Или лучше переделывать все запросы на алиасы? |
||||||||
|
|||||||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 453 |
4-4.1-4.2. Чё за ерунда? какая связь между блокировкой и выполняемой операцией?
Это просто два независимых блокирования. Под ними можно использовать таблицу ни разу, один раз или два раза. И ещё - имя таблицы одновременно есть и её алиас. Так что не "с алиасом и без алиаса", а в любом случае дав алиаса. Просто один совпадает с именем таблицы (а также - существует всегда и не может быть удалён или переопределён). -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
maxipub |
|
|||
Опытный Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Самому интересно. Немного переспав с этой мыслью, и еще после Вашего напоминания что имя таблицы одновременно и есть ее алиасом. Походу начал понимать суть происходящего. Видимо на уровне движка СУБД блокировка происходит не физически по таблице, а по алиасам. Когда есть блокировка, движок пускает к заблокированным алаисам (и только к ним) "хозяина" блокировки, а всех остальных пускает только к не заблокированным (и только к ним) таблицам. Ну, конечно, с учетом типа блокировки. Просто вчера мне было не понятно, как можно блокировать одну и ту же таблицу в рамках одной блокировки и на чтение, и на запись... Но если на уровне движка блокировка выполняется по алиасу, то все ясно и понятно. |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 453 |
Не блокировка, а УЧЁТ блокировок. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |