|
|
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
Всем привет. Вот решил я в новом проекте заюзать деревья в формате nested sets. Уже всё написал... начал по поводу использования движка innoDB с сис.админом общаться, что бы не было потом споров, в случае чего (так как в myISAM нету транзакций, и потому целостность данных обеспечить не получится в полной мере)... И тут самое интересное... Он начал меня пугать, что дерево в таком виде может привести к проблемам в случае одновременной записи с двух разных клиентов. Например при вставке новых строк. Представим мы запустили 2 транзакции... и получили такую последовательность запросов: 1. Чтение левого и правого индексов родителя, транзакция 1 2. Чтение левого и правого индексов родителя, транзакция 2 3. сдвиг индексов (освобождение места под новые элементы), транзакция 1 4. сдвиг индексов (освобождение места под новые элементы), транзакция 2 5. вставка новых элементов, транзакция 1 6. вставка новых элементов (в том числе, учитывая что индексы родителя мы считали до вставки в первой транзакции, с перезаписью новых элементов первой транзакции), транзакция 2 В итоге вторая транзакция затрёт данные первой, при этом ещё и образуется разрыв индексов. Так вот... как я понимаю он же меня правильно пугает, в случае если я использую транзакции со стандартным для mysql уровнем изоляции (REPEATABLE READ)? Подскажите пожалуйста кто и как смотрит на такие моменты, и какие действия стоит предпринять во избежание порчи данных. P.S. Просто я так глобально задумываюсь о безопасности данных впервые... раньше были большие проекты, но они писались не с нуля, потому меня не сильно волновало как ядро движка это разруливало... Однако сейчас под несколько больших проектов пишу собственный... И не хотелось бы потом ломать голову и переделывать половину работы из-за неверно выбранной структуры. Всем заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 10:53:26 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
кстати, ещё хуже ситуация видится при удалении строк. Когда оба клиента читают левые и правые индексы удаляемых элементов, правый удаляет свои строки, двигает индексы, а потом второй удаляет свои строки по ранее прочитанным индексам и ломает всю структуру дерева... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 11:03:49 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
Всё... похоже разобрался... Любой SELECT на таком уровне изоляции выполняется как SELECT ... FOR UPDATE, что соответственно блокирует прочитанные строки (любая другая транзакция будет ждать завершения данной). Потому любые UPDATE, DELETE и SELECT в которых участвуют данные строки, будут отложены до завершения транзакции. В итоге, если я прочитал левый и правый индексы родителя, я могу быть уверен, что они уже не будут изменены кем либо другим. В общем меня испугали только лишний раз, похоже транзакции со стандартным уровнем изоляции в полной мере обеспечивают целостность данных :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 11:48:44 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
Програмёр, ПрограмёрВот решил я в новом проекте заюзать деревья в формате nested sets тоесть просто взял и решил? незная о плюсах и минусах этого решения? дело в том что, nested sets имеют особенности:плюсы - очень быстры на выборках, минусы - сложны в реализации, медленны на модификации,добавлении, удалении. поэтому их выбирают там где дерево будет меняться мало и редко - а выбираться из него часто и много. идеальный вариант - категории товаров. правит их Админ, или скрипт автоматом. юзеры сайта только читают. т.е. описанная проблема маловероятна или даже исключена. если планируется хранить в дереве чтото, что будут активно и много менять юзеры - то nested sets - выбирать нельзя. вот и все. об этом нужно было подумать сразу, еще при выборе типа дерева (paretn,matherialized path,nested sets...), а не выбирать просто наобум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 11:50:35 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
авторюбой SELECT на таком уровне изоляции выполняется как SELECT ... FOR UPDATE, эпично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 11:54:59 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
автортак как в myISAM нету транзакций, REPEATABLE READ ты сделал мой день ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 11:55:45 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
r uПрограмёр, ПрограмёрВот решил я в новом проекте заюзать деревья в формате nested sets тоесть просто взял и решил? незная о плюсах и минусах этого решения? дело в том что, nested sets имеют особенности:плюсы - очень быстры на выборках, минусы - сложны в реализации, медленны на модификации,добавлении, удалении. поэтому их выбирают там где дерево будет меняться мало и редко - а выбираться из него часто и много. идеальный вариант - категории товаров. правит их Админ, или скрипт автоматом. юзеры сайта только читают. т.е. описанная проблема маловероятна или даже исключена. если планируется хранить в дереве чтото, что будут активно и много менять юзеры - то nested sets - выбирать нельзя. вот и все. об этом нужно было подумать сразу, еще при выборе типа дерева (paretn,matherialized path,nested sets...), а не выбирать просто наобум. А я и думал... Дерево используется для описания полной структуры сайта (в том числе каталоги, галереи, сама структура страниц, и т.д., с привязкой этого всего к общему меню сайта). Однако, там где могут работать 2 менеджера - может случится конфликт при записи данных. Потому просто оставлять как есть я не хочу, потом я же не могу заказчику сказать "Сами виноваты, зачем у Вас 2 менеджера одновременно полезли структуру менять?". Один например начнёт товары добавлять, а другой в это время решит страничку удалить... и вдруг время обращения совпадёт? вероятность то понятно 1 к 10^(фиг знает каком), однако в случае утери данных, я не хочу по башке получить. То есть по сути дерево - это общий реестр данных сайта... там сформирована полная структура сайта (вплоть до последней картинки), а уже данные каждого модуля (цены товаров, их названия, содержание страницы и т.д.) лежат в своих собственных таблицах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 12:14:54 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
ScareCrowавтортак как в myISAM нету транзакций, REPEATABLE READ ты сделал мой день и чё?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 12:21:49 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
Програмёр, чем дальше, тем интересней... и зачем тебе нестид сетс тогда. под словом быстрая выборка, было найти всю ветку данного родителя! как я понимаю тебе такие задачи не светят, тебе надо будет выбирать только непосредственых потомков. а инноДБ для твоей базы, когда в които веки надо будет удалить ветку, сделает это автоматически при соответсвующем каскадном действии.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 13:08:10 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
alex564657498765453Програмёр, чем дальше, тем интересней... и зачем тебе нестид сетс тогда. под словом быстрая выборка, было найти всю ветку данного родителя! как я понимаю тебе такие задачи не светят, тебе надо будет выбирать только непосредственых потомков. а инноДБ для твоей базы, когда в които веки надо будет удалить ветку, сделает это автоматически при соответсвующем каскадном действии.. Особенно интересно это звучит в момент, когда надо скопировать ветку и вставить в другом месте. Просто недавно был случай, когда организация открыла ещё один техцентр и было дано задание "всё, что есть в первом техцентре надо в точности перенести во второй техцентр, только поменять там .... " (разумеется от SEO'шника по шапке получили и сразу поменяли и тексты дублей). Однако с трёхуровневой структурой меню я долбался около часа, в то время как на nested sets такое копирование заняло бы от силы 10 минут (вернее даже меньше). ситуации разные бывают :) Завязываться на нестандартных возможностях движка innoDB (имеется ввиду на тех, которых нету в других движках, типа как каскадные действия) я не хочу... Авось клиент скажет что не может врубить этот движок у себя на серваке? или например что-то пойдёт не так и в какой-то момент надо будет поменять движок (мало ли... всё надо продумать)... Или вообще база поменяется (например с mysql на ту же mssql надо будет перевести)? И вместо беглого взгляда на код и правки 10 строчек всё обойдётся в конкретные костыли и изменение структуры всего :) Система делается глобальная и по возможности универсальная. P.S. по поводу " как я понимаю тебе такие задачи не светят, тебе надо будет выбирать только непосредственых потомков". Да элементарно.... Вот например на одном из планируемых сайтов в ТЗ прописано наличие страницы "карта сайта" :) В моём случае моё дерево и есть в прямом виде карта сайта (конечно подразумевается в таблице наличие пункта "показать в карте сайта"). И какая польза от такой карты, если пользователю придётся её разворачивать уровень за уровнем (при этом другие ветки будут скрыты, то есть он может не найти то, что ему надо). Ему нужна полноценная развёрнутая карта. А как это сделать без рекурсии, если хранить данные не в формате nested sets? Или ещё... Для другого сайта требуется по дизайну писать общее количество наименований товаров в категории... Как мне это сделать без рекурсии? Так что нет, этот формат как-раз для моих нужд очень удобен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 13:39:54 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
авторАвось клиент скажет что не может врубить этот движок у себя на серваке With MySQL 5.5, InnoDB becomes the default storage engine ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 13:54:33 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
Програмёрalex564657498765453Програмёр, чем дальше, тем интересней... и зачем тебе нестид сетс тогда. под словом быстрая выборка, было найти всю ветку данного родителя! как я понимаю тебе такие задачи не светят, тебе надо будет выбирать только непосредственых потомков. а инноДБ для твоей базы, когда в които веки надо будет удалить ветку, сделает это автоматически при соответсвующем каскадном действии.. Особенно интересно это звучит в момент, когда надо скопировать ветку и вставить в другом месте. Просто недавно был случай, когда организация открыла ещё один техцентр и было дано задание "всё, что есть в первом техцентре надо в точности перенести во второй техцентр, только поменять там .... " (разумеется от SEO'шника по шапке получили и сразу поменяли и тексты дублей). Однако с трёхуровневой структурой меню я долбался около часа, в то время как на nested sets такое копирование заняло бы от силы 10 минут (вернее даже меньше). ситуации разные бывают :) Завязываться на нестандартных возможностях движка innoDB (имеется ввиду на тех, которых нету в других движках, типа как каскадные действия) я не хочу... Авось клиент скажет что не может врубить этот движок у себя на серваке? или например что-то пойдёт не так и в какой-то момент надо будет поменять движок (мало ли... всё надо продумать)... Или вообще база поменяется (например с mysql на ту же mssql надо будет перевести)? И вместо беглого взгляда на код и правки 10 строчек всё обойдётся в конкретные костыли и изменение структуры всего :) Система делается глобальная и по возможности универсальная. P.S. по поводу " как я понимаю тебе такие задачи не светят, тебе надо будет выбирать только непосредственых потомков". Да элементарно.... Вот например на одном из планируемых сайтов в ТЗ прописано наличие страницы "карта сайта" :) В моём случае моё дерево и есть в прямом виде карта сайта (конечно подразумевается в таблице наличие пункта "показать в карте сайта"). И какая польза от такой карты, если пользователю придётся её разворачивать уровень за уровнем (при этом другие ветки будут скрыты, то есть он может не найти то, что ему надо). Ему нужна полноценная развёрнутая карта. А как это сделать без рекурсии, если хранить данные не в формате nested sets? Или ещё... Для другого сайта требуется по дизайну писать общее количество наименований товаров в категории... Как мне это сделать без рекурсии? Так что нет, этот формат как-раз для моих нужд очень удобен. про "нестандартные" возможности иннодб тебе написали. карта сайта, пример очень хороший, но в то же время ради этого всем сайтам делать нестид сетс??? я не спросил, вопрос сдесь сразу есть ответом, что карту сайта надо делать по другим соображениям. а вообще да, видишь только прямых потомков, потом клиент что надо раздвигает(аджакс) видит вложенное. или будешь ему делать полную выгрузку из базы постоянно(полное дерево с названием и ссылкой) а нащёт варианта, что части твоей базы в другие копируються... ну сдесь да, нестид сетс тебя спасёт.(разово я бы и без нестид сетс делал создание дубля данных, удаления каскадно нужной ветки в дубле, выбор нужной части... ) но это разово так можно, если у тебя часто надо делиться ветками дерева с другими базами, то да....это уже случай часто нужна ветка. Модератор: Тема перенесена из форума "PHP, Perl, Python". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 14:13:46 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
ПрограмёрСистема делается глобальная и по возможности универсальная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 18:29:37 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
может поможет http://qweewqrty.blogspot.ru/2014/01/mysql.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 08:19:39 |
|
||
|
nested sets параллельная запись
|
|||
|---|---|---|---|
|
#18+
вадяможет поможет http://qweewqrty.blogspot.ru/2014/01/mysql.html помогло бы... да вот только я уже много чего прочитал... Кстати, по ссылке инфа как минимум неверна в фразе "Транзакции (START TRANSACTION) сами блокировки не ставят". Дело в том, что ставят... А самый высокий уровень изоляции, даже читать те же строки в разных транзакциях не позволяет одновременно :) Так что инфа не принесла пользы просто из-за того, что появляются сомнения о её верности :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 10:26:12 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38635406&tid=1834872]: |
0ms |
get settings: |
6ms |
get forum list: |
22ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 360ms |

| 0 / 0 |
