powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / mobilink и "длинные" транзакции
6 сообщений из 6, страница 1 из 1
mobilink и "длинные" транзакции
    #35023443
Марсель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asa 902.3546
Есть ML синхр. ASA-ASA по timestamp полю.
Есть проблемы с "длинными" транзакциями на сервере.
В качестве примера, есть таблица в главной БД, которая включена в синхронизацию, и тригер для задержки вставки на <XX> секунд:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE "dba"."test_table"
(                  
  "ID"          bigint NOT NULL DEFAULT global autoincrement ,
  "col1"        integer not NULL ,
  last_updated  TIMESTAMP NOT NULL DEFAULT TIMESTAMP,
  PRIMARY KEY ("ID"),
)
go

create TRIGGER "test_trigger" before insert order  1  on dba.test_table
referencing new as new_row
for each row 
begin
  WAITFOR DELAY '00:00:<XX>';
end;

Если на сервере сделать
Код: plaintext
1.
insert into test_table(col1) values( 1 );
commit;

И в это время удаленный клиент за <XX> сек. успевает синхронизироваться,
то данная запись из test_table будет пропущена для этого клиента.

Вопрос - как правильно это дело решить?
Заранее спасибо !
...
Рейтинг: 0 / 0
mobilink и "длинные" транзакции
    #35024174
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марсель wrote:
> Если на сервере сделать
>
> insert into test_table(col1) values(*1*);
> commit;
>
>
> И в это время удаленный клиент за <XX> сек. успевает синхронизироваться,
> то данная запись из test_table будет пропущена для этого клиента.
>
> Вопрос - как правильно это дело решить?

Триггер-то работает внутри INSERT-а, и внутри транзакции.
Пока транзакция не закончится, эта запись в репликацию не уйдет,
как я понимаю. Так что таким вот способом, как я понимаю, никак.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
mobilink и "длинные" транзакции
    #35024376
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МарсельВопрос - как правильно это дело решить?хы.... нууууу..... можно сделать дополнительную процедуру которая будет "завершать" транзакцию. Что то в духе:
Код: plaintext
1.
2.
3.
4.
5.
begin atomic
    update table1 set last_updated = current timestamp;
    update table2 set last_updated = current timestamp;
    update table3 set last_updated = current timestamp;
    commit;
end;
И запускать ее вместо простого commit. Либо повесить кучку аналогичных триггеров и дергать самую нижнюю таблицу иерархии, а с нее по триггерам timestamp распространится до самого верха и потом сразу коммитить.

А еще можно (и наверное будет правильнее) повесить пару обработчиков на sp_hook_dbmlsync_begin и sp_hook_dbmlsync_log_rescan а в них уже записывать время старта очередной синхронизации и решать надо ли запустить повторное сканирование лога. Сам я такое не делал, и какие там подводные камни не знаю, но судя по BOL это то в чем надо поковыряться.
...
Рейтинг: 0 / 0
mobilink и "длинные" транзакции
    #35025640
Марсель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Триггер-то работает внутри INSERT-а, и внутри транзакции.
Пока транзакция не закончится, эта запись в репликацию не уйдет,
как я понимаю. Так что таким вот способом, как я понимаю, никак.
Posted via ActualForum NNTP Server 1.4

В ML синхр. на сервере (по умолчанию) включается уровень изоляции = Read commited, и пока транзакция не закончится курсоры на download не увидят этой строки, это так и есть.

Но дело в том, что строка вообще никогда не попадет в синх. данному клиенту.
Например, транз. началась во время t1, поле last_updated примет значение t1 (ну или очень близкое к этому значение), клиент начнет синхронизацию во время t1+dt1, и закончится в t1+dt2, где dt1 < dt2 < <XX>.
И в след. синхронизацию для данного клиента курсор будет иметь вид
Код: plaintext
select * from test_table where last_updated > t1+dt2

под условия которого эта строка не подпадает

все это имхо, я так понимаю :)
...
Рейтинг: 0 / 0
mobilink и "длинные" транзакции
    #35025688
Марсель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА еще можно (и наверное будет правильнее) повесить пару обработчиков на sp_hook_dbmlsync_begin и sp_hook_dbmlsync_log_rescan а в них уже записывать время старта очередной синхронизации и решать надо ли запустить повторное сканирование лога. Сам я такое не делал, и какие там подводные камни не знаю, но судя по BOL это то в чем надо поковыряться.

эээээ.... ну..... :)
sp_hook_dbmlsync_...
это вроде для клиентов, а проблема возникает на стороне сервера, есть тут пара событий
modify_last_download_timestamp
modify_next_last_download_timestamp
пойду курить

Спасибо за советы.
...
Рейтинг: 0 / 0
mobilink и "длинные" транзакции
    #35042975
yourij_mw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в одном из ebf asa было обновление мл_сервера, в котором позволялось задавать опцию при которой мл_сервер запоминал не дату начала download транзакции МЛ, а дату начала самой ранней транзакции во всей базе, которая была активна до начала той-же download транзакции . Как писалось это для сереров ASE, потому я тогда подумал что данной проблемы в аса нету. т.к. по поведению аса на изоляции 1 вставленная незакомиченная строка не должна бы игнорироватся как в ASE.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / mobilink и "длинные" транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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