powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / nested sets параллельная запись
16 сообщений из 16, страница 1 из 1
nested sets параллельная запись
    #38635292
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Вот решил я в новом проекте заюзать деревья в формате nested sets. Уже всё написал... начал по поводу использования движка innoDB с сис.админом общаться, что бы не было потом споров, в случае чего (так как в myISAM нету транзакций, и потому целостность данных обеспечить не получится в полной мере)...

И тут самое интересное... Он начал меня пугать, что дерево в таком виде может привести к проблемам в случае одновременной записи с двух разных клиентов. Например при вставке новых строк. Представим мы запустили 2 транзакции... и получили такую последовательность запросов:
1. Чтение левого и правого индексов родителя, транзакция 1
2. Чтение левого и правого индексов родителя, транзакция 2
3. сдвиг индексов (освобождение места под новые элементы), транзакция 1
4. сдвиг индексов (освобождение места под новые элементы), транзакция 2
5. вставка новых элементов, транзакция 1
6. вставка новых элементов (в том числе, учитывая что индексы родителя мы считали до вставки в первой транзакции, с перезаписью новых элементов первой транзакции), транзакция 2

В итоге вторая транзакция затрёт данные первой, при этом ещё и образуется разрыв индексов.

Так вот... как я понимаю он же меня правильно пугает, в случае если я использую транзакции со стандартным для mysql уровнем изоляции (REPEATABLE READ)?

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

P.S. Просто я так глобально задумываюсь о безопасности данных впервые... раньше были большие проекты, но они писались не с нуля, потому меня не сильно волновало как ядро движка это разруливало... Однако сейчас под несколько больших проектов пишу собственный... И не хотелось бы потом ломать голову и переделывать половину работы из-за неверно выбранной структуры.

Всем заранее спасибо.
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635311
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, ещё хуже ситуация видится при удалении строк. Когда оба клиента читают левые и правые индексы удаляемых элементов, правый удаляет свои строки, двигает индексы, а потом второй удаляет свои строки по ранее прочитанным индексам и ломает всю структуру дерева...
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635367
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё... похоже разобрался... Любой SELECT на таком уровне изоляции выполняется как SELECT ... FOR UPDATE, что соответственно блокирует прочитанные строки (любая другая транзакция будет ждать завершения данной). Потому любые UPDATE, DELETE и SELECT в которых участвуют данные строки, будут отложены до завершения транзакции. В итоге, если я прочитал левый и правый индексы родителя, я могу быть уверен, что они уже не будут изменены кем либо другим.

В общем меня испугали только лишний раз, похоже транзакции со стандартным уровнем изоляции в полной мере обеспечивают целостность данных :)
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635370
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр,

ПрограмёрВот решил я в новом проекте заюзать деревья в формате nested sets
тоесть просто взял и решил? незная о плюсах и минусах этого решения?

дело в том что, nested sets имеют особенности:плюсы - очень быстры на выборках, минусы - сложны в реализации, медленны на модификации,добавлении, удалении.

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

если планируется хранить в дереве чтото, что будут активно и много менять юзеры - то nested sets - выбирать нельзя. вот и все.

об этом нужно было подумать сразу, еще при выборе типа дерева (paretn,matherialized path,nested sets...), а не выбирать просто наобум.
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635376
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторюбой SELECT на таком уровне изоляции выполняется как SELECT ... FOR UPDATE,
эпично.
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635377
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автортак как в myISAM нету транзакций,
REPEATABLE READ
ты сделал мой день
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635397
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uПрограмёр,

ПрограмёрВот решил я в новом проекте заюзать деревья в формате nested sets
тоесть просто взял и решил? незная о плюсах и минусах этого решения?

дело в том что, nested sets имеют особенности:плюсы - очень быстры на выборках, минусы - сложны в реализации, медленны на модификации,добавлении, удалении.

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

если планируется хранить в дереве чтото, что будут активно и много менять юзеры - то nested sets - выбирать нельзя. вот и все.

об этом нужно было подумать сразу, еще при выборе типа дерева (paretn,matherialized path,nested sets...), а не выбирать просто наобум.

А я и думал... Дерево используется для описания полной структуры сайта (в том числе каталоги, галереи, сама структура страниц, и т.д., с привязкой этого всего к общему меню сайта). Однако, там где могут работать 2 менеджера - может случится конфликт при записи данных. Потому просто оставлять как есть я не хочу, потом я же не могу заказчику сказать "Сами виноваты, зачем у Вас 2 менеджера одновременно полезли структуру менять?". Один например начнёт товары добавлять, а другой в это время решит страничку удалить... и вдруг время обращения совпадёт? вероятность то понятно 1 к 10^(фиг знает каком), однако в случае утери данных, я не хочу по башке получить.

То есть по сути дерево - это общий реестр данных сайта... там сформирована полная структура сайта (вплоть до последней картинки), а уже данные каждого модуля (цены товаров, их названия, содержание страницы и т.д.) лежат в своих собственных таблицах.
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635406
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавтортак как в myISAM нету транзакций,
REPEATABLE READ
ты сделал мой день

и чё?!
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635469
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр,

чем дальше, тем интересней... и зачем тебе нестид сетс тогда.

под словом быстрая выборка, было найти всю ветку данного родителя! как я понимаю тебе такие задачи не светят, тебе надо будет выбирать только непосредственых потомков.

а инноДБ для твоей базы, когда в които веки надо будет удалить ветку, сделает это автоматически при соответсвующем каскадном действии..
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635510
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453Програмёр,

чем дальше, тем интересней... и зачем тебе нестид сетс тогда.

под словом быстрая выборка, было найти всю ветку данного родителя! как я понимаю тебе такие задачи не светят, тебе надо будет выбирать только непосредственых потомков.

а инноДБ для твоей базы, когда в които веки надо будет удалить ветку, сделает это автоматически при соответсвующем каскадном действии..

Особенно интересно это звучит в момент, когда надо скопировать ветку и вставить в другом месте. Просто недавно был случай, когда организация открыла ещё один техцентр и было дано задание "всё, что есть в первом техцентре надо в точности перенести во второй техцентр, только поменять там .... " (разумеется от SEO'шника по шапке получили и сразу поменяли и тексты дублей). Однако с трёхуровневой структурой меню я долбался около часа, в то время как на nested sets такое копирование заняло бы от силы 10 минут (вернее даже меньше).

ситуации разные бывают :) Завязываться на нестандартных возможностях движка innoDB (имеется ввиду на тех, которых нету в других движках, типа как каскадные действия) я не хочу... Авось клиент скажет что не может врубить этот движок у себя на серваке? или например что-то пойдёт не так и в какой-то момент надо будет поменять движок (мало ли... всё надо продумать)... Или вообще база поменяется (например с mysql на ту же mssql надо будет перевести)? И вместо беглого взгляда на код и правки 10 строчек всё обойдётся в конкретные костыли и изменение структуры всего :)

Система делается глобальная и по возможности универсальная.

P.S. по поводу " как я понимаю тебе такие задачи не светят, тебе надо будет выбирать только непосредственых потомков". Да элементарно.... Вот например на одном из планируемых сайтов в ТЗ прописано наличие страницы "карта сайта" :) В моём случае моё дерево и есть в прямом виде карта сайта (конечно подразумевается в таблице наличие пункта "показать в карте сайта"). И какая польза от такой карты, если пользователю придётся её разворачивать уровень за уровнем (при этом другие ветки будут скрыты, то есть он может не найти то, что ему надо). Ему нужна полноценная развёрнутая карта. А как это сделать без рекурсии, если хранить данные не в формате nested sets?

Или ещё... Для другого сайта требуется по дизайну писать общее количество наименований товаров в категории... Как мне это сделать без рекурсии?

Так что нет, этот формат как-раз для моих нужд очень удобен.
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635542
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторАвось клиент скажет что не может врубить этот движок у себя на серваке

With MySQL 5.5, InnoDB becomes the default storage engine
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635575
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрalex564657498765453Програмёр,

чем дальше, тем интересней... и зачем тебе нестид сетс тогда.

под словом быстрая выборка, было найти всю ветку данного родителя! как я понимаю тебе такие задачи не светят, тебе надо будет выбирать только непосредственых потомков.

а инноДБ для твоей базы, когда в които веки надо будет удалить ветку, сделает это автоматически при соответсвующем каскадном действии..

Особенно интересно это звучит в момент, когда надо скопировать ветку и вставить в другом месте. Просто недавно был случай, когда организация открыла ещё один техцентр и было дано задание "всё, что есть в первом техцентре надо в точности перенести во второй техцентр, только поменять там .... " (разумеется от SEO'шника по шапке получили и сразу поменяли и тексты дублей). Однако с трёхуровневой структурой меню я долбался около часа, в то время как на nested sets такое копирование заняло бы от силы 10 минут (вернее даже меньше).

ситуации разные бывают :) Завязываться на нестандартных возможностях движка innoDB (имеется ввиду на тех, которых нету в других движках, типа как каскадные действия) я не хочу... Авось клиент скажет что не может врубить этот движок у себя на серваке? или например что-то пойдёт не так и в какой-то момент надо будет поменять движок (мало ли... всё надо продумать)... Или вообще база поменяется (например с mysql на ту же mssql надо будет перевести)? И вместо беглого взгляда на код и правки 10 строчек всё обойдётся в конкретные костыли и изменение структуры всего :)

Система делается глобальная и по возможности универсальная.

P.S. по поводу " как я понимаю тебе такие задачи не светят, тебе надо будет выбирать только непосредственых потомков". Да элементарно.... Вот например на одном из планируемых сайтов в ТЗ прописано наличие страницы "карта сайта" :) В моём случае моё дерево и есть в прямом виде карта сайта (конечно подразумевается в таблице наличие пункта "показать в карте сайта"). И какая польза от такой карты, если пользователю придётся её разворачивать уровень за уровнем (при этом другие ветки будут скрыты, то есть он может не найти то, что ему надо). Ему нужна полноценная развёрнутая карта. А как это сделать без рекурсии, если хранить данные не в формате nested sets?

Или ещё... Для другого сайта требуется по дизайну писать общее количество наименований товаров в категории... Как мне это сделать без рекурсии?

Так что нет, этот формат как-раз для моих нужд очень удобен.

про "нестандартные" возможности иннодб тебе написали.

карта сайта, пример очень хороший, но в то же время ради этого всем сайтам делать нестид сетс??? я не спросил, вопрос сдесь сразу есть ответом, что карту сайта надо делать по другим соображениям. а вообще да, видишь только прямых потомков, потом клиент что надо раздвигает(аджакс) видит вложенное. или будешь ему делать полную выгрузку из базы постоянно(полное дерево с названием и ссылкой)

а нащёт варианта, что части твоей базы в другие копируються... ну сдесь да, нестид сетс тебя спасёт.(разово я бы и без нестид сетс делал

создание дубля данных, удаления каскадно нужной ветки в дубле, выбор нужной части...
) но это разово так можно, если у тебя часто надо делиться ветками дерева с другими базами, то да....это уже случай часто нужна ветка.

Модератор: Тема перенесена из форума "PHP, Perl, Python".
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38635934
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрСистема делается глобальная и по возможности универсальная.
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38636173
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38636300
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяможет поможет
http://qweewqrty.blogspot.ru/2014/01/mysql.html

помогло бы... да вот только я уже много чего прочитал... Кстати, по ссылке инфа как минимум неверна в фразе "Транзакции (START TRANSACTION) сами блокировки не ставят". Дело в том, что ставят... А самый высокий уровень изоляции, даже читать те же строки в разных транзакциях не позволяет одновременно :)

Так что инфа не принесла пользы просто из-за того, что появляются сомнения о её верности :)
...
Рейтинг: 0 / 0
nested sets параллельная запись
    #38636346
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там про применение их в хранимках
это несколько другое
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / nested sets параллельная запись
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]