powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Из грида добраться до XSQLVAR
25 сообщений из 54, страница 2 из 3
Из грида добраться до XSQLVAR
    #38877054
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВроде бы в теории эта фича для этого и должна использоваться.
Сценарий:
1) Т1 стартует
2) Т2 стартует, производит изменения, завершается
3) Т3 стартует, активирует подписку, вычитывает изменения, завершается
4) Т1 раздупляется и тоже производит изменения, завершается
5) Т4 стартует, активирует подписку, вычитывает изменения, завершается

Из всего, что я знаю о репликации, вытекают три "съедобные" возможности:
1) Т3 увидит изменения Т2, а Т4 увидит только изменения Т1
2) Т3 не увидит изменений Т2
3) Т3 увидит изменения Т2, а Т4 увидит изменения Т1 И Т2
Все остальные возможности отправляют репликацию лесом. Возможность 1 это маленькое чудо и
я не представляю как его совершить. Если им это удалось - мысленно им аплодирую.

PS: О том, что можно забыть об изменяемых PK, говорить излишне.
PPS: Какой план даёт чтение изменений я стараюсь не думать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877088
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov3) Т3 увидит изменения Т2, а Т4 увидит изменения Т1 И Т2
все вроде штатно. Т4 увидит изменения Т1 И Т2 потому что Т1 и Т2 завершились до старта Т4. Или я чего то не понял?
Почему Т3 не должна увидеть изменений Т2, или Т4 не должна увидеть изменений Т2?

Я бы еще понял вопрос, что будет с изменениями, которые были сделаны и закоммичены во время работы Т3 и Т4. Но и тут есть ответ - при commit подписки сохраняются изменения, сделанные с момента старта транзакции, которая получала подписку.

Dimitry SibiryakovPPS: Какой план даёт чтение изменений я стараюсь не думать.
х.з., не проверял. наверное, ты хотел спросить, какой результат будет при чтении изменений с where? :-)
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877122
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТ4 не должна увидеть изменений Т2?
Потому что их уже вычитала Т3 и закоммитилась. Это, насколько я понял, должно подвинуть
планку "увиденных" изменений и исключить их из просмотра последующими транзакциями.

kdvнаверное, ты хотел спросить, какой результат будет при чтении изменений с where?
:-)
Нет, именно без WHERE. Представь таблицу в 100500 записей из которых изменилась всего
одна. Full scan на каждое чтение изменений это смерть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877138
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПотому что их уже вычитала Т3 и закоммитилась.
а, понял.

Тогда подписка Т4 увидит только изменения Т1, потому что действительно, изменения в Т2 уже вычитаны подпиской в Т3.

То есть, твой пункт 1.

авторПредставь таблицу в 100500 записей из которых изменилась всего одна. Full scan на каждое чтение изменений это смерть.
дык. тут иначе не выйдет. это ж версии, а где они есть - х.з., поэтому надо читать всю таблицу (если нужны изменения ко всей таблице).
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877206
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТогда подписка Т4 увидит только изменения Т1, потому что действительно,
изменения в Т2 уже вычитаны подпиской в Т3.

То есть, твой пункт 1.
Уверен? Если это действительно так, то меня очень интересовал бы способ которым они такого
эффекта достигают. Покамест у меня для этого только одна идея и та довольно дикая...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877279
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovспособ которым они такого эффекта достигают.
эээ, ну ведь известны номера транзакций, и т.д.

тут еще вот в чем фокус. чтобы подписка вообще "началась", ее нужно активировать. Поэтому, собственно, в твоем сценарии, если подписка N, упоминаемая в Т3, ни разу до этого не активировалась, то никаких изменений она не увидит. Потому что она началась только в Т3.
Извиняюсь, если ввел в заблуждение. изменения отслеживаются только с момента первой активации подписки

Так что ответ на твой сценарий (и если в Т3 и Т4 подписка от одного и того же пользователя), это
- Т3 не увидит изменений Т2, поскольку они были совершены до момента активации подписки
- Т4 увидит изменения Т1, потому что они были произведены с момента начала Т3 (в которой подписка была активирована).
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877293
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvэээ, ну ведь известны номера транзакций, и т.д.
Да. И в том-то и фишка, что одного номера транзакции для этого недостаточно.

kdvв твоем сценарии, если подписка N, упоминаемая в Т3, ни разу до этого не
активировалась, то никаких изменений она не увидит.
Естественно, предполагается, что этот сценарий осуществляется в середине рабочего потока
(который workflow, а не stream) и подписка давно уже активировалась, а теперь раз в Х
секунд приходит репликатор чтобы вычитать изменения с последнего прихода и перенести их в
БД-приёмник.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877395
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ну тогда подписка в Т3 увидит изменения в Т2. А подписка в Т4 увидит изменения с момента начала транзакции Т3.
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877506
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЕстественно, предполагается, что этот сценарий осуществляется в середине рабочего потока
(который workflow, а не stream) и подписка давно уже активировалась, а теперь раз в Х
секунд приходит репликатор чтобы вычитать изменения с последнего прихода и перенести их в
БД-приёмник.


Так по идее же репликаторов может быть несколько (?), поэтому T4 должна видеть то что поменялось с последнего commut-а T4 и T3 точно так-же ( вариант 3 ).
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877819
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81Так по идее же репликаторов может быть несколько
И для каждого создаётся своя индивидуальная подписка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877902
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

В ХЕ7 не так.
Подписка - это что-то типа view, в котором прописано какие таблицы надо отслеживать, какие столбцы, и какие действия.
пользователю выдаются права на конкретную подписку
Далее пользователь может активировать подписку, причем обязательно указывая некое имя (типа "устройство"), откуда он получает изменения по этой подписке.
Так что у одного юзера может быть несколько подписок - на мобиле, в офисе, дома и т.п.

Что касается видимости, то
- юзер получает изменения, произошедшие с момента активации подписки. Получает он их в транзакции snapshot. commit в этой транзакции сигнализирует о том, что юзер получил все изменения, которые произошли ДО СТАРТА этой snapshot-транзакции.
А чтобы активировать подписку и сидеть ждать изменений, нужно сделать
subscription active
тут можно даже inactive сделать
rollback

то есть, активация-деактивация подписки вместе с commit/rollback определяет, что будет дальше с этой подпиской - активна или нет, получаем изменения или смотрим реальные данные. Выключается подписка только по inactive+commit;
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877920
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvто есть, активация-деактивация подписки вместе с commit/rollback определяет, что будет дальше с этой подпиской - активна или нет, получаем изменения или смотрим реальные данные. Выключается подписка только по inactive+commit;

А разве смотрим сами изменения а не факт их наличия?
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38877927
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvДалее пользователь может активировать подписку, причем обязательно указывая
некое имя (типа "устройство"), откуда он получает изменения по этой подписке.
То есть изменения, полученные для одного устройства будут уже не видны для этого же
устройства, но для других устройств они будут всё ещё видны? Ну пусть так, разница не
большая. Главное чтобы изменения помечались как "увиденные" независимо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878487
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТо есть изменения, полученные для одного устройства будут уже не видны для этого же
устройства, но для других устройств они будут всё ещё видны?
идентификатором подписчика является Имя_пользователя[+имя_устройства].

Код: sql
1.
SET SUBSCRIPTION [<subscription_name> [, <subscription_name> ...]]  [AT <destination>] {ACTIVE | INACTIVE};


указание at - необязательное.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE RDB$SUBSCRIBERS (
    RDB$SUBSCRIBER_NAME                  CHAR(67) CHARACTER SET UNICODE_FSS,
    RDB$SUBSCRIPTION_NAME                CHAR(67) CHARACTER SET UNICODE_FSS,
    RDB$DESTINATION                      CHAR(32) CHARACTER SET NONE,
    RDB$FLAGS                            SMALLINT,
...

CREATE INDEX RDB$INDEX_55 ON RDB$SUBSCRIBERS (RDB$SUBSCRIPTION_NAME, RDB$SUBSCRIBER_NAME, RDB$DESTINATION);
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878493
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv....
вот думал думал над этой конструкцией сегодня и так и не понял.
с какого момента начинается логирование наличия изменений?
Со старта транзакции в которой :
set SUBSCRIPTION <subscription_name> AT <destination> ACTIVE
COMMIT;
вроде как невозможно, т.к. журнала нет и придётся привентивно все изменения с момента старта любой транзакии помнить

если с момента commit; то выходит что нужно для начала логгирования гарантировать что не будет пропущено нужных изменений, т.к. фактически set ... active делать в монопольном режиме.

Или я чего-то недопонял?
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878494
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так и думал, что они кусок TIP-а в блоб загоняют...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878500
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81вроде как невозможно, т.к. журнала нет
В качестве журнала в данном случае используется TIP.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878513
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81с какого момента начинается логирование наличия изменений?
Со старта транзакции в которой :
set SUBSCRIPTION <subscription_name> AT <destination> ACTIVE
COMMIT;
вроде как невозможно, т.к. журнала нет и придётся привентивно все изменения с момента старта любой транзакии помнить

ыыыы...
set subscription active включает отслеживание изменений, которые были с момента старта транзакции, в которой было вот это active.
при этом commit сигнализирует о том, что изменения, которые были до старта этой транзакции, уже получены.
Чтобы отслеживать изменения дальше, и после завершения транзакции, надо сделать rollback.
active
rollback

я выше об этом писал 2 раза. в rdb$subscribers запоминаются параметры транзакции, с которой нужно отслеживать изменения. Они меняются на текущую транзакцию по commit. чтобы их не менять, т.е. оставить стартом исходную транзакцию с первым active, нужно сделать rollback.

далее, active/inactive меняют вывод операторов. После inactive выводятся все существующие данные. после active - только измененные с момента начала отслеживания подписки.

Еще более популярно.

1. коннект
2. стартуем снапшот
3. получаем обычные данные
4. set subs active
5. получаем изменения, с момента первого active/rollback или последнего active/commit

теперь, допустим, делаем
6. rollback (подписка остается активной, даже если сделать inactive, т.к. изменения мы не получили)
7. disconnect
8. connect
9. старт транзакции
10. тут мы получаем ОБЫЧНЫЕ данные. Потому что сервер в этот момент не имеет понятия, что мы - это мы, и у нас активна подписка. Вернее, он может догадаться, что мы - это мы, но это ему не нужно.
11. set subs active
12. ура, видим те же изменения, что получали в пункте 5.
13. нам надоели изменения, делаем inactive
14.1. теперь, если тут сделать rollback, то все можно повторить с пункта 7, и мы в пункте 12 увидим те же изменения
14.2. если тут сделать commit, подписка прекратит отслеживать изменения. если же не было пункта 13, то подписка останется активной, но в следующий раз мы будем видеть только те изменения, которые произошли с момента пункта 9.
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878515
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЯ так и думал, что они кусок TIP-а в блоб загоняют...
там и tip, и еще туча сохраненных маркеров, причем, часть из них вроде как на будущее, или я пока не понял, зачем.
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878606
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv1. коннект
2. стартуем снапшот
3. получаем обычные данные
4. set subs active
5. получаем изменения, с момента первого active/rollback или последнего active/commit

...

про rollback понятно, вылетело.

А вот кое-чего что-то не понимаю, а как определяется что запись удалена (она же физически отсутсвует)?
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878635
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81а как определяется что запись удалена (она же физически отсутсвует)?
удаление записи в версионнике - это создание новой версии. Версия просто содержит признак удаления, а не измененные столбцы, как при update.
В snapshot ты же видишь удаленные другими транзакциями записи во время этого снапшота? Потому что продолжают существовать удаленная "версия/запись" и версия с признаком удаления.

Я ведь писал, что активация подписки замораживает сборку мусора. А модифицированный движок сервера дает возможность увидеть не только что было модифицировано или добавлено, но и что было удалено.
То есть, активная подписка превращается в нечто вроде долгоживущего снапшота, со всеми вытекающими последствиями в виде накопления версий, правда, только для тех объектов и действий, которые указаны в подписке, а не для всех таблиц БД.
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878638
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81,

проще всего пример с insert. Если активация подписки произошла в транзакции 1000, значит для вытаскивания изменений с момента активации такой подписки достаточно выбрать все версии, у которых transaction id >=1000.
Для update - то же самое. Для delete - ищем версии с delete stub >=1000, показываем предыдущую версию.
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878795
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvNikolayV81,

проще всего пример с insert. Если активация подписки произошла в транзакции 1000, значит для вытаскивания изменений с момента активации такой подписки достаточно выбрать все версии, у которых transaction id >=1000.
Для update - то же самое. Для delete - ищем версии с delete stub >=1000, показываем предыдущую версию.

Так. если нет журнала то где он версию то хранит, надо будет перечитать, что-то не чисто тут.
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878830
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81если нет журнала то где он версию то хранит
кто где версию хранит? ты это, совсем про версионность не в курсе, или путаешь что?
версии и так исходно хранятся на диске и представляют собой пресловутый журнал. Зачем их еще где-то хранить?
...
Рейтинг: 0 / 0
Из грида добраться до XSQLVAR
    #38878837
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvNikolayV81если нет журнала то где он версию то хранит
кто где версию хранит? ты это, совсем про версионность не в курсе, или путаешь что?
версии и так исходно хранятся на диске и представляют собой пресловутый журнал. Зачем их еще где-то хранить?

Но нет гарантии что не затёрты
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Из грида добраться до XSQLVAR
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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