Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Вопрос по обработку отката транзации  [new]
Ptn
Member

Откуда:
Сообщений: 15
В Cache'e есть какая либо возможность отловить вызовы trollback что бы выполнить свой код по факту отката транзакции?

Или скажем понять что между двумя временными точками был trollback?
Не по журналу, так как это наверное точно можно но наверняка жутко медленно, а по каким либо "флагам", "счетчикам" процессов области, номерам завершенных транзакций?

Callback метод %Rollback для объектов это не то, он я так понимаю, срабатывает только если в %Save что то пошло не так, а мне хотелось бы обнаружить факт произведения произвольного tro
30 апр 19, 08:45    [21875169]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13234
Ptn, тестовый пример сделай для иллюстрации... ;)
30 апр 19, 08:56    [21875181]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
Ptn
Member

Откуда:
Сообщений: 15
Факт наличия открытой транзакции на текущий момент так же подойдет
30 апр 19, 09:01    [21875190]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
Ptn
Member

Откуда:
Сообщений: 15
krvsa
естовый пример сделай для иллюстрации... ;)


Тут не пример, тут постановка задачи скорее всего.

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

В триггерах и callback таблиц можно использовать выставление флага через $increment аля

 set x = $increment(^CacheTempUserBlaBla)


инкримент не откатывается в tro и оставляет четкий след что было изменение начальных данных.

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

* TSTART
* Что то генерируем в исходных данных
* Вызываем подсчет агрегата, обнаруживается факт изменения данных кеш валидируется
* TROLLBACK

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

И что неприятно TROLLBACK вообще может быть в соседнем процессе относительно вызова подсчета агрегата, главно что бы он исходные данные задевал.

По идее для обнаружения проблемы мне достаточно номера последней откаченной транзакции, анализируя который можно предположить невалидность кеша
30 апр 19, 09:14    [21875204]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
vassil
Member

Откуда: Хабаровск
Сообщений: 112
$TLEVEL - узнает кол-во открытых транзакций. Может быть на основе этого сделать логику.
30 апр 19, 10:06    [21875259]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13234
Ptn
Тут не пример, тут постановка задачи скорее всего.

Тестовый пример всяко лучше...
Если ты его не можешь сделать - уже говорит о многом. Обычно о хотении чего-то заоблачного. Причем настолько, что его нельзя представить в виде схематичной, небольшой программки.
30 апр 19, 10:08    [21875262]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
Ptn
Member

Откуда:
Сообщений: 15
vassil,

$TL это уровень транзакции в текущем процессе, если соседний процесс изменил начальные данные а потом откатил, ты об этом не узнаешь.
30 апр 19, 10:52    [21875316]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
Ptn
Member

Откуда:
Сообщений: 15
krvsa,

Ты мой ответ читал вообще? Там пошагово описан пример. Давай не будем оценивать друг друга.
30 апр 19, 10:55    [21875318]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
Ptn
Member

Откуда:
Сообщений: 15
Документация либо молчит либо намекает что такое узнать нельзя.

Видимо придется смотреть в сторону LOCK удерживаемого до TCOMMIT или TROLLBACK
30 апр 19, 10:56    [21875322]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13234
Ptn
Давай не будем оценивать друг друга.

Проблема твоя - тебе и решать...
30 апр 19, 14:02    [21875533]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
Сообщений: 2715
Ptn,

Есть у меня подозрение, что счетчик откатов транзакций должен быть реализован. Вопрос только в том как получить к нему доступ. Возможно имеет смысл задать вопрос на Developer Community, и может быть даже кто нибудь ответит. Или стоит спросить через WRC.
30 апр 19, 17:40    [21875802]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3808
Ptn
 set x = $increment(^CacheTempUserBlaBla)

инкримент не откатывается в tro и оставляет четкий след что было изменение начальных данных.
В данном случае оно не откатится еще потому, что это CACHETEMP нежурналируемая база.

Вы делаете один кэш на несколько процессов, а потом боретесь с тем, что данные меняются в параллельных процессах?
И при этом не блокируете ресурсы? Но вы же как-то отслеживаете их изменение?
Хотите отслеживать откат транзакций других процессов? Откат транзакций делается либо вручную, либо по ошибке. И в том и другом случае можно добавить код для пересчета кэша.
А за длительные транзакции нужно вообще бить по рукам.
В общем, мне кажется, вопрос больше к архитектуре приложения, а не возможностям Каше.

Была мысль, что такая же проблема должна быть при работе с битовыми индексами, потом подумал, что битовые операции скорее всего журналируются особым образом, и откатывается только один бит, а не вся строка.
30 апр 19, 20:55    [21875977]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обработку отката транзации  [new]
Ptn
Member

Откуда:
Сообщений: 15
Вопрос решен.

Дополнил инкримент блокировкой левого глобала ^BlaBla с последующей разблокировкой , которая остается висеть до конца завершения транзакции.

Соответственно без относительно процессов.
- если ^CacheTempUserBlaBla больше нуля, имеют место измененные данные, нужно пересчитывать агрегат
- если не удается эксклюзивно заблокировать ^BlaBla значит исходные данные находятся в незавершенной транзакции, то есть закешированный результат использовать нельзя.

Всем спасибо.
1 май 19, 13:40    [21876308]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить