|
|
|
имитация тригерра
|
|||
|---|---|---|---|
|
#18+
вообщем нужна помощь. есть база мускла, но изза Галеры(решение для создания кластера) нельзя использовать тригеры как и хранимые процедуры. а действия както нужно делать надёжно. для примера. есть files(idfile,fk_idfolder,...,fk_idnode1,fk_idnode2,fk_idnode3,file_size) был бы тригер, я бы поставил каскадное удаление файлов при удалении папки, и тригером в таблице nodes(idnode,total_size) уменьшил бы для соответсвующих нод поле total_size=total_size-file_size у нас тригера нету. ставим каскадное действие - поставить НУЛ. но как теперь надёжно удалить записи файлов обновив поле total_size ? Сложность заключаеться в том, что все ноды равноправны, то есть любое ваше предложение должно сработать и сработать верно, даже если все ноды попытаються это сделать одновременно, ведь на них всех база одна, и идеология системы такая, что все ноды абсолютноравноправны, и выпадание любой не нарушает работы системы совершенно. тоесть каждая работает, без помощи других, так как будто других нету, но работает так, что даже если все остальные тоже самое втоже время сделают с базой, чтобы не получилось путаницы. ==== можно расмотреть вариант, что каждая нода, делает следующее 1)идет файлы без ссылки на папку, где встречаеться её айдишник, щитает размер этих файлов, и уменьшает своё тотал_сайз, затем вместо ссылки на себя проставляет нулл. 2)удаляет файлы для которых все три ссылки на ноды равны нулл. Я счас так и сделал, но может можно как-то использую блокировки(не имел дела вообще) добиться результата без длительного процеса. Это ведь быстродействие падает изза перестройки индексов в таблице файлов. да и ждать пока каждая нода отработает тоже не прикольно, особено если одна на время выпала ЗЫ есть конечно вариант перечитать документацию мускла, и надеяться что я чего не пропустил, но лучше спросить для начала знающих, а потом уже буду дочитывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2014, 19:48:29 |
|
||
|
имитация тригерра
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, Что-то я не улавливаю связи между размером файла и ссылочной целостностью. Можете прояснить этот вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2014, 19:56:04 |
|
||
|
имитация тригерра
|
|||
|---|---|---|---|
|
#18+
miksoft, ...хм. как бы этой связи и нету. вопрос как тригер симитировать, при условии, что эту процедуру имитации могут запустить сразу несколько клиентов базы данных, которые друг о друге ничего не знают. и вот сработать они должны не мешая друг другу. давайте проще в таблице ноды айдиноды сумарный_размер_данных 1 333 333 333 байт 2 444 333 333 байт 3 555 333 333 байт ......Другие ноды таблица файлы помимо нормальных файла, содежит два которые пользователь удалил айди_файла размер зеркало1 зеркало2 зеркало3 айдипапки 23 333байт 1 5 7 нулл 233 1000байт 3 2 11 нулл ....другие файлы которые не удалялисьнапример 233 2222байт 3 2 11 252 надо, набор скл команд, который сделает верно работу , а именно идентичную этой Код: sql 1. 2. 3. 4. откуда числа полагаю понятно. написать такой код вроде не проблема. но нужно, чтобы в случае одновременного запуска этого кода несколькими надоми, мы не получили множественно отнимание из тотал_сайз для одного и того же файла. вот напишу я код, который по сути создаст курсор на select * from files where fk_idfolder is null и обработает каждую строку выборки (fetch cursor into idfile, size ,....) запросами update nodes set total_size = total_size - @size where idnode IN (@mirro1, @mirro2, @mirro3) delete from files where files.idfile = @idfile НО если подобный код направят в базу несколько нод, мы не правильно обновим размеры в таблице ноды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2014, 20:57:49 |
|
||
|
имитация тригерра
|
|||
|---|---|---|---|
|
#18+
alex564657498765453...хм. как бы этой связи и нету.Ну как же? А это о чем:alex564657498765453уменьшил бы для соответсвующих нод поле total_size=total_size-file_size? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 09:49:23 |
|
||
|
имитация тригерра
|
|||
|---|---|---|---|
|
#18+
miksoft, когда мы сохраняем новый файл в системе в папке с айди 112, размером 1000 на ноды 2 4 55 мы делаем Код: sql 1. 2. сделать апдейт без тригера сравнительно легко, ведь мы добавляем файлы грубо говоря по одному. а вот при удалении папки, в которой подпапки, в которых подподподподподпод.... одним махом удаляеться возможно 1000 000 файлов. бегать циклом , прослеживать все дерево вглубь возможно на 100 уровней - затея мягко говоря глупая. спасает нас каскадные действия. тригера нету, а при удалении файлов обратные изменения в НОДЫ нужно сделать. итого имеем - каскадно при удалении папки, fk_idfolder = null и остаёться вопрос, как теперь сделать собственно удаление files и обновление nodes исходя из того что этот код могут запустить одновременно несколько клиентов, но не должно произойти двойных отниманий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 12:01:20 |
|
||
|
имитация тригерра
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, Триггер, кстати, вас не спас бы. При каскадных действиях триггера не срабатывают, это документированная фича. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 12:25:09 |
|
||
|
имитация тригерра
|
|||
|---|---|---|---|
|
#18+
miksoft, что серьёзно? тю , так дела ещо хуже чем я думал. хотя тригер можно было бы привентить к удалению папки афтер(опосле) но это не вариант в моём случае. миксофт, вопрос в догонку, а move как можно в скл реализовать. move=copy+delete но таким макаром, чтобы кто как бы не пытался из нового и старого места щитать одну и туже строку, это было не возможно. с другой стороны, если два запроса будут делать мув где К=100, то то что переместит один, просто не попадёться другому. временые таблицы, катит, транкзанкции катит. как можно реализовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 13:36:58 |
|
||
|
имитация тригерра
|
|||
|---|---|---|---|
|
#18+
alex564657498765453миксофт, вопрос в догонку, а move как можно в скл реализовать. move=copy+delete но таким макаром, чтобы кто как бы не пытался из нового и старого места щитать одну и туже строку, это было не возможно. с другой стороны, если два запроса будут делать мув где К=100, то то что переместит один, просто не попадёться другому. временые таблицы, катит, транкзанкции катит. как можно реализовать?Если честно, я практически не понимаю ваш язык. Если вопрос о том, чтобы удалить запись из одной таблицы и вставить ее в другую таблицу, то можно попробовать примерно так: Код: sql 1. 2. 3. 4. Должна быть либо явно начата транзакция, либо выключен автокоммит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 13:45:55 |
|
||
|
имитация тригерра
|
|||
|---|---|---|---|
|
#18+
miksoft, ну возьмём вариант что будет первой строкой - трнзанкшн старт меня другое интересует, а если в буза прийдёт сразу 5 таких запросов, что будет? первая включит лок на записи, вторая - пятая будут висеть, пока лок не сниметься, а потом ничего не найдут??? а есть вариант в скл типа такого select <...> from table where <...> AND ROW IS NOT LOCK ?? ну то есть я прото, что если пять запросов сразу пришло, то чтоб 4 не висели, а просто ничего не нашли да завершились? ЗЫ может это кажеться странным, но вот такая ситуацию у меня. нет центрального узла, система полностью децентрализована, поэтому любое плановое действие делают все узлы, и втом числе удаление с перещотом размера на нодах. поэтому код должен быть таким, чтобы одинаковые копии кода не мешали один другому, не подвисали. был бы центральный узел, сервер с бд, было бы замечательно, там бы сделал задания, но такого узла нету. база = кластер, то есть каждая нода имеет свою копию базы, и каждая будет делать одно и тоже, не зная ничего о том, что сделали/не сделали другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 19:06:48 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=190&tid=1835346]: |
0ms |
get settings: |
6ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 232ms |
| total: | 400ms |

| 0 / 0 |
