powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / осудите стратегию репликации
25 сообщений из 57, страница 2 из 3
осудите стратегию репликации
    #38505700
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky, да не в дырках дело. Вот какой сценарий
может быть проблемным:

началась транзакция А, да призадумалась
началась транзакция Б (read committed)
транзакция Б запросила генератор и получила 1
транзакция А запросила генератор и получила 2
транзакция А вставила запись АА в таблицу data
транзакция А вставила в таблицу скриптов репликации ('insert into data запись АА ',2)
транзакция А завершилась
транзакция Б вставила запись ББ в таблицу data
-- где запись ББ ссылается на АА
транзакция Б вставила в таблицу скриптов репликации ('insert into data запись ББ',1),
транзакция Б завершилась

Просыпается мафия репликатор.
select * from таблица_скриптов order by id

По порядку она отправляет в другую базу сначала запись ББ, потом запись АА.
Запись ББ не вставляется, т.к. нарушение FK.

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

Но вдруг есть ещё какая-нибудь лазейка.
Или, допустим, если ясно, что такой сценарий со снапшотом невозможен, то можно
и не сортировать таблицы, а отправлять именно поток изменений в "порядке" их
возникновения.

практика показывает, что ничего страшного не случается.
А вот это обнадёживает :)

NickDee, вариант с монопольной блокировкой базы или таблицы
мне не нравится.
Шавлюк Евгений, ваш вариант тоже не нравится из-за необходимости
лишних действий при б/р.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505729
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden,

после чтения трехдневных курсов я смутно понимаю этот топик, но зато я помню, что существует решение по нахождению новых вставленных и измененных записей, через доп. столбец с инкрементируемым генератором. При Insert и update этот генератор всегда инкрементируется, и пишется в этот доп. столбец.
Некая клиенская часть получает последний номер генератора и затем считывает данные с gen > N. Затем она запоминает кол-во записей и N+X, и при последующем чтении использует это значение для поиска новых записей. Как-то так.
Исключением тут является удаление записей, потому что удаленных записей нет, а значит и нечего вычитать из "столбца с генератором". Отсюда вывод - или не удалять записи (а лишь "помечать" их на удаление программно), или применять другое решение.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505776
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenNickDee, вариант с монопольной блокировкой базы или таблицы
мне не нравится.
Реализация такая. Но это не значит, что нельзя написать без блокировок, при том же концепте. Просто придётся обрабатывать конфликты записи. Писал бы сейчас - обработал бы.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505779
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee, в моей задаче вроде не предвидятся конфликты записей, т.к. база tgt не пишет в справочники. Поэтому для меня блокировка выглядит слишком уж тяжёлой ношей.

kdv, не совсем легко понять вас, но если я правильно понял, то вроде Dimitry Sibiryakov уже развенчал такой вариант.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505785
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvbudden,

после чтения трехдневных курсов я смутно понимаю этот топик, но зато я помню, что существует решение по нахождению новых вставленных и измененных записей, через доп. столбец с инкрементируемым генератором. При Insert и update этот генератор всегда инкрементируется, и пишется в этот доп. столбец.
Некая клиенская часть получает последний номер генератора и затем считывает данные с gen > N. Затем она запоминает кол-во записей и N+X, и при последующем чтении использует это значение для поиска новых записей. Как-то так.
Исключением тут является удаление записей, потому что удаленных записей нет, а значит и нечего вычитать из "столбца с генератором". Отсюда вывод - или не удалять записи (а лишь "помечать" их на удаление программно), или применять другое решение.
Вот ровно то, что ты сказал, реализовано у меня :) Только столбец с инкрементируемым генератором вынесен в общую таблицу. И там же флаг удаления.
А в прошлой редакции у меня было в каждой таблице поле IsDeleted. Надоело мне втыкать этот IsDeleted во все where, и вынес его в отдельную таблицу.
А вот держать генератор в каждой таблице - это я сразу отказался, т.к. при каждой синхронизации делать запрос к 100 таблицам только для того чтобы убедиться что синхронизировать там нечего - это было вне моей совести :)
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505811
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee, можно обернуть каждую таблицу во вьюху, где прятать этих невидимок.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505958
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, есть какая-то сермяжная правда в твоих словах, Ivan_Pisarevsky. Ненужного я нагородил. Повлияло то, что изначально решение по репликации уже было, но из другой программы и на других принципах. Пытался за них держаться, чтобы делать поменьше изменений. Но это было неправильно. Наверное, попробую пойти по твоим стопам и вести просто лог всех запросов, которые потом будут выполняться на целевой базе.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505962
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ппц, товарищи. Лог запросов (текстов операторов!) не
только с какого-то дуба назван традиционным решением, но
и выбран в качестве решения в 2013 (уже почти 2014) году.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505971
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЭто ппц, товарищи.
Ну а чего такого? Интерпретатор формул (компилятор) и репликатор баз данных это две вполне
тривиальные задачи. Каждый программист на своём веку должен написать хотя бы один.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505979
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не против лисапеда. Я против деревянных треугольных колёс.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506006
Гаджимурадов РустамЭто ппц, товарищи. Лог запросов (текстов операторов!) не
только с какого-то дуба назван традиционным решением, но
и выбран в качестве решения в 2013 (уже почти 2014) году.
Гаджимурадов РустамЯ не против лисапеда. Я против деревянных треугольных колёс.

В отсутсвии канонического решения "от производителя" для всех видов репликации (а есть ещё частичная синхронизация разнометадатовых) высер не обоснован
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506008
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А "частичная синхронизация разнометадатовых" надо
делать методом складывания операторов DDL в лог, да.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506009
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамнадо делать методом складывания операторов DDL в лог, да.

Во-первых, не DDL, а DML. Во-вторых, а какая, собственно, разница в каком виде данные
складывать в лог? Я складываю в двоичном, Иван и Хольгерт - в виде скрипта. Каждое решение
имеет плюсы и минусы. У меня нет проблем с блобами, у них - возможность покопаться
грязными ручками если приспичит.

PS: А кто такой "производитель Firebird"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506014
Гаджимурадов Рустам,
Перечитал несколько раз. Если имелось ввиду что лог DML не спасёт отца русской чегототам - решение не самое идеальное, то я таки Вас не понял и мой опус должен последовать в топку.
Но даже в этом случае формулировка могла быть менее витиевата.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506030
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov> Во-первых, не DDL, а DML

Зависит от того, что такое "разнометадатовых".
Я подумал, что это опечатка и "метаданные",
и тогда такие DDL, а не DML. Что подумал ты
и что имел в виду автор сего термина - ХЗ.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506213
Сисдба Мастеркеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden пишет:

> Вот какой сценарий может быть проблемным:

> началась транзакция А, да призадумалась
> началась транзакция Б (read committed)
> транзакция Б запросила генератор и получила 1
> транзакция А запросила генератор и получила 2
> транзакция А вставила запись АА в таблицу data
> транзакция А вставила в таблицу скриптов репликации ('insert into data
> запись АА ',2) транзакция А завершилась
> транзакция Б вставила запись ББ в таблицу data
> -- где запись ББ ссылается на АА
> транзакция Б вставила в таблицу скриптов репликации ('insert into data
> запись ББ',1), транзакция Б завершилась

> Просыпается мафия репликатор.
> select * from таблица_скриптов order by id

> По порядку она отправляет в другую базу сначала запись ББ , потом запись
> АА. Запись ББ не вставляется, т.к. нарушение FK.

А зачем такой порядок ? Надо в порядке коммита: сначала АА, затем ББ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506459
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenНаверное, попробую пойти по твоим стопам и вести просто лог всех запросов, которые потом будут выполняться на целевой базе.Вообще-то выше я тебе предлагал к Сибирякову податься, а не идти по стопам. ;)
Гаджимурадов Рустамвыбран в качестве решения в 2013 (уже почти 2014) году.это решение было выбрано еще до меня лет 10 назад, не вижу никаких причин рыпаться с тем, что совершенно нормально работает.
Гаджимурадов РустамЯ против деревянных треугольных колёс.В этих интернетах вечно кто-то не прав! Хотя собсто выше про это тебе уже сказали , не вижу причин продолжать.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506481
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЗависит от того, что такое "разнометадатовых".
Я подумал, что это опечатка и "метаданные",
Я прочитал это как "базы с отличающейся структурой".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38507054
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky> это решение было выбрано еще до меня лет 10 назад, не вижу
Ivan_Pisarevsky> никаких причин рыпаться с тем, что совершенно нормально работает.

Претензий к "не рыпаться" нет, не ломать работающее это
правильно, но это не делает сие решение "традиционным".

Dimitry Sibiryakov> Я прочитал это как "базы с отличающейся структурой".

Это вообще отдельный случай. И вряд ли в этом
случае логировать операторы - хорошее решение.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38507067
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky, да уж поздно рыпаться - много сделал уже. Хотя на сайт Сибирякова заходил, ценник действительно демократичный. Сторонний продукт - всегда риск, что вдруг кастомизация окажется в чём-то недостаточной и начнёшь вокруг этого продукта плясать с бубном. Ну и другие причины, например, у нас есть уже свой сервер приложений, ну озадачим его ещё одним видом деятельности. Плюс к тому, я умею делать, чтобы метаданные для репликатора росли вместе со структурой базы. Плюс к тому, кастомный алгоритм назначения ид-ов. Плюс к тому, репликация должна идти не с нуля, а заменяет уже существующий алгоритм, который отчасти справляется с задачей, часть данных уже закачаны, и т.д., и т.п.

Я не буду создавать стейтменты в виде текста, буду раскладывать данные по полям, но в целом для меня самое важное то, что последовательность действий _можно_ передавать с одного сервера на другой и это работает. Это не было очевидно.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38507142
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden> Я не буду создавать стейтменты в виде текста

Аминь.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38520530
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buddenIvan_Pisarevsky, да не в дырках дело. Вот какой сценарий
может быть проблемным:

началась транзакция А, да призадумалась
началась транзакция Б (read committed)
транзакция Б запросила генератор и получила 1
транзакция А запросила генератор и получила 2
транзакция А вставила запись АА в таблицу data
транзакция А вставила в таблицу скриптов репликации ('insert into data запись АА ',2)
транзакция А завершилась
транзакция Б вставила запись ББ в таблицу data
-- где запись ББ ссылается на АА
транзакция Б вставила в таблицу скриптов репликации ('insert into data запись ББ',1),
транзакция Б завершилась

Почему бы не сделать вставку в таблицу скриптов репликации в триггере на after insert, тогда описанной проблемы не возникнет в принципе.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38520810
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всех с прошедшими!
Fr0sT-Brutal,

началась транзакция A
А:insert into data values (AA)
А:триггер data_after_insert
gen_id(g_replication,1)->1
insert into replication_script values ('insert into data values (AA)',1)


началась транзакция Б
Б:insert into data values (ББ)
Б:триггер data_after_insert
gen_id(g_replication,1)->2
insert into replication_script values ('insert into data values (ББ)',2)
Б:commit

просыпается репликатор, видит запись 2 и отправляет её в другую БД

А:commit
просыпается репликатор, видит запись 1 и отправляет её в другую БД

Ничего, что они записи не по порядку номеров, да и вообще не пойми как?
На данный момент я уже этим вопросом не парюсь.
Репликацию написал, на тестировании посмотрим.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38520823
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenНичего, что они записи не по порядку номеров, да и вообще не пойми как?

Одно из основных свойств транзакций это независимость. Две независимые транзакции могут
быть проведены в любом порядке. Результат от этого не меняется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38520880
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
budden, хочешь сказать, что можно закоммитить инсерт, ссылающийся на другой, незакоммиченный инсерт?
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / осудите стратегию репликации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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