Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / имитация тригерра / 9 сообщений из 9, страница 1 из 1
23.01.2014, 19:48:29
    #38536013
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имитация тригерра
вообщем нужна помощь.

есть база мускла, но изза Галеры(решение для создания кластера) нельзя использовать тригеры как и хранимые процедуры.
а действия както нужно делать надёжно.

для примера.
есть 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)удаляет файлы для которых все три ссылки на ноды равны нулл.

Я счас так и сделал, но может можно как-то использую блокировки(не имел дела вообще) добиться результата без длительного процеса. Это ведь быстродействие падает изза перестройки индексов в таблице файлов. да и ждать пока каждая нода отработает тоже не прикольно, особено если одна на время выпала





ЗЫ есть конечно вариант перечитать документацию мускла, и надеяться что я чего не пропустил, но лучше спросить для начала знающих, а потом уже буду дочитывать.
...
Рейтинг: 0 / 0
23.01.2014, 19:56:04
    #38536017
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имитация тригерра
alex564657498765453,

Что-то я не улавливаю связи между размером файла и ссылочной целостностью. Можете прояснить этот вопрос?
...
Рейтинг: 0 / 0
23.01.2014, 20:57:49
    #38536078
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имитация тригерра
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.
delete from files where fk_idfolder IS NULL;

update nodes set total_size=total_size - 333 where idnode in (1,5,7);
update nodes set total_size=total_size - 1000 where idnode in (3,2,11);



откуда числа полагаю понятно.

написать такой код вроде не проблема.

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

вот напишу я код, который по сути создаст курсор на
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

НО
если подобный код направят в базу несколько нод, мы не правильно обновим размеры в таблице ноды.
...
Рейтинг: 0 / 0
24.01.2014, 09:49:23
    #38536335
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имитация тригерра
alex564657498765453...хм. как бы этой связи и нету.Ну как же? А это о чем:alex564657498765453уменьшил бы для соответсвующих нод поле total_size=total_size-file_size?
...
Рейтинг: 0 / 0
24.01.2014, 12:01:20
    #38536588
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имитация тригерра
miksoft,
когда мы сохраняем новый файл в системе в папке с айди 112, размером 1000 на ноды 2 4 55 мы делаем

Код: sql
1.
2.
insert into files (size,other_info,mirro1,mirro2,mirro3,fk_idfolder) values(1000,'value',2,4,55,112);
update nodes set total_size = total_size+1000 where idnode in (2,4,55);




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

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

бегать циклом , прослеживать все дерево вглубь возможно на 100 уровней - затея мягко говоря глупая. спасает нас каскадные действия.

тригера нету, а при удалении файлов обратные изменения в НОДЫ нужно сделать.

итого имеем - каскадно при удалении папки, fk_idfolder = null

и остаёться вопрос, как теперь сделать собственно удаление files и обновление nodes

исходя из того что этот код могут запустить одновременно несколько клиентов, но не должно произойти двойных отниманий.
...
Рейтинг: 0 / 0
24.01.2014, 12:25:09
    #38536653
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имитация тригерра
alex564657498765453,

Триггер, кстати, вас не спас бы. При каскадных действиях триггера не срабатывают, это документированная фича.
...
Рейтинг: 0 / 0
24.01.2014, 13:36:58
    #38536818
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имитация тригерра
miksoft,

что серьёзно? тю , так дела ещо хуже чем я думал.

хотя тригер можно было бы привентить к удалению папки афтер(опосле)

но это не вариант в моём случае.

миксофт, вопрос в догонку, а move как можно в скл реализовать.

move=copy+delete но таким макаром, чтобы кто как бы не пытался из нового и старого места щитать одну и туже строку, это было не возможно.
с другой стороны, если два запроса будут делать мув где К=100, то то что переместит один, просто не попадёться другому.

временые таблицы, катит, транкзанкции катит.

как можно реализовать?
...
Рейтинг: 0 / 0
24.01.2014, 13:45:55
    #38536840
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имитация тригерра
alex564657498765453миксофт, вопрос в догонку, а move как можно в скл реализовать.

move=copy+delete но таким макаром, чтобы кто как бы не пытался из нового и старого места щитать одну и туже строку, это было не возможно.
с другой стороны, если два запроса будут делать мув где К=100, то то что переместит один, просто не попадёться другому.

временые таблицы, катит, транкзанкции катит.

как можно реализовать?Если честно, я практически не понимаю ваш язык.

Если вопрос о том, чтобы удалить запись из одной таблицы и вставить ее в другую таблицу, то можно попробовать примерно так:
Код: sql
1.
2.
3.
4.
SELECT * FROM table1 WHERE ... FOR UPDATE
INSERT INTO table2 ... SELECT ... FROM table1 WHERE ...
DELETE FROM table1 WHERE ...
COMMIT

Должна быть либо явно начата транзакция, либо выключен автокоммит.
...
Рейтинг: 0 / 0
24.01.2014, 19:06:48
    #38537345
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имитация тригерра
miksoft,

ну возьмём вариант что будет первой строкой - трнзанкшн старт

меня другое интересует, а если в буза прийдёт сразу 5 таких запросов, что будет?

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

а есть вариант в скл типа такого

select <...> from table where <...> AND ROW IS NOT LOCK
??

ну то есть я прото, что если пять запросов сразу пришло, то чтоб 4 не висели, а просто ничего не нашли да завершились?

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

был бы центральный узел, сервер с бд, было бы замечательно, там бы сделал задания, но такого узла нету. база = кластер, то есть каждая нода имеет свою копию базы, и каждая будет делать одно и тоже, не зная ничего о том, что сделали/не сделали другие.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / имитация тригерра / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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