powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Откат глобалов
25 сообщений из 29, страница 1 из 2
Откат глобалов
    #36446298
berumin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
переодически (достаточно редко) происходит откат глобалов - изменения просто исчезают,
при этом в программе транзакции не используются вообще.

создается документ, с ним происходит работа, и в какой-то момент все откатывается назад (это все в течении нескольких минут). при этом программа "связи" успевает иногда получить (вернее сказать: выдернуть) данные о документе, потом они пропадают.

закономерности не выявлено, в логах полная тишина.

Может кто сталкивался с таким ?
Cache 4, delphi+vism, все без sql

заранее благодарен за ответ(ы)
...
Рейтинг: 0 / 0
Откат глобалов
    #36446355
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пропадать не пропадало ничего пока... Вот появлялось порой с задержкой - это бывало...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Откат глобалов
    #36446372
berumin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaПропадать не пропадало ничего пока... Вот появлялось порой с задержкой - это бывало...
----------

в программе конструкции вида
s gbl="^Documents"
l +@gbl
s @gbl=@gbl+1
l -@gbl
s
numdocument=@gbl
s @gbl@(numdocument,IDGoods)=quantity
s @globalrest@(IDGoods)=@globalrest@(IDGoods)-quantity
все проходит, программа на Delphi прекрасно получает сформированный документ, проходит пару минут - документа нет, нумерация не порвана, в примере изменение остатков - тоже ничего не рвет.
параллельно запущен процесс который выбирает данные и отправляет из в другую базу - он иногда видит (успевает увидеть) создаваемый документ, но чуть позже под этим же кодом пойдут другой....
...
Рейтинг: 0 / 0
Откат глобалов
    #36446621
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присваивание numdocument делается вне "защищенной" секции кода, поэтому существует вероятность, что у 2 процессов будет одинаковое значение numdocument. Лучше хотя бы так:
Код: plaintext
1.
2.
l +@gbl
s (numdocument,@gbl)=@gbl+ 1 
l -@gbl
А (совсем правильно :) так:
Код: plaintext
s numdocument=$i(@gbl)
...
Рейтинг: 0 / 0
Откат глобалов
    #36446729
berumin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey MaslovПрисваивание numdocument делается вне "защищенной" секции кода, поэтому существует вероятность, что у 2 процессов будет одинаковое значение numdocument. Лучше хотя бы так:
Код: plaintext
1.
2.
l +@gbl
s (numdocument,@gbl)=@gbl+ 1 
l -@gbl
А (совсем правильно :) так:
Код: plaintext
s numdocument=$i(@gbl)

согласен...
с другой стороны
Код: plaintext
1.
2.
s @gbl@(numdocument,IDGoods)=quantity
s @globalrest@(IDGoods)=@globalrest@(IDGoods)-quantity
в двух разных документах IDGoods разные
но после "пропадения" первого документа -
глобали @gbl@(numdocument,IDGoods) нет
а @globalrest@(IDGoods) содержит изначальное значение
процедуры которая бы такое делала в контексте текущего проекта нет.
Такие эффекты были замечены при маленьких загрузках - т.е. в программе работал один человек
и никто параллельно не мог создать еще такой же документ (это к слову о lock в примере)

спасибо за совет
...
Рейтинг: 0 / 0
Откат глобалов
    #36446791
berumin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
beruminДобрый день.
переодически (достаточно редко) происходит откат глобалов - изменения просто исчезают,
при этом в программе транзакции не используются вообще.

хотел дополнить...
журналирование глобалей я не включал, если смотреть через панель управления, локальные БД, области, глобалы - галка журналирование не стоит.
но были случаи - повреждения БД , в этом случае откат глобалов мог быть достаточно большим - до полдня работы и это происходило после перезапуска каше: в момент его остановки.
но тут хоть как-то логично объяснимо, а тут откат в процессе работы без каких-либо "но"
...
Рейтинг: 0 / 0
Откат глобалов
    #36446794
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что тут скажешь... Если глобала нет, значит сущестует программный код, который его почистил. К тому же IDGoods вычисляется вне приведенного фрагмента. Ловить такие ошибки, тем более в Cache 4, действительно, тяжело. Там только отладчик в командной строке. Почитайте док-ю, помнится была возможность трассировки выполнения команд.
...
Рейтинг: 0 / 0
Откат глобалов
    #36446826
berumin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey MaslovЧто тут скажешь... Если глобала нет, значит сущестует программный код, который его почистил. К тому же IDGoods вычисляется вне приведенного фрагмента. Ловить такие ошибки, тем более в Cache 4, действительно, тяжело. Там только отладчик в командной строке. Почитайте док-ю, помнится была возможность трассировки выполнения команд.
программного кода уничтожения документа нет в проекте. только обнулить документ, но удаления нет.
нумерация документов - простой инкремент - пропусков в нумерации тоже нет.
IDGoods - в принципе массив с кодами товаров.
Если бы я мог повторить "баг" - то понятно кто был бы виноват, а так ... есть н-цать установок прикладного ПО - переодически - где-то пропадает документ таким образом... может один, может два за месяц.. но при этом документов тысячи. если был бы виноват программный (прикладной) код - то эффект был бы каким-то более постоянным.
на каком-то форуме читал был "баг" в каше связанные с реакцией на транзакцию во время перевода системного времени.
...
Рейтинг: 0 / 0
Откат глобалов
    #36446999
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovПрисваивание numdocument делается вне "защищенной" секции кода, поэтому существует вероятность, что у 2 процессов будет одинаковое значение numdocument. Лучше хотя бы так:
Код: plaintext
1.
2.
l +@gbl
s (numdocument,@gbl)=@gbl+ 1 
l -@gbl
А (совсем правильно :) так:
Код: plaintext
s numdocument=$i(@gbl)

В чем разница твоего варианта и варианта автора?
Если некий процесс делает инкремент - другой будет висеть на блокировке

Код: plaintext
l +@gbl

Пока первый не даст команду

Код: plaintext

Разве не так?
Или как тогда понимать термин "защищенной" секции кода ?
...
Рейтинг: 0 / 0
Откат глобалов
    #36447015
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разница в том, что $I() позволяет отказаться от блокировки. Т.е., 1 команда вместо 3 в предыдущем варианте.
...
Рейтинг: 0 / 0
Откат глобалов
    #36447022
berumin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

но два процесса одновременно могут обратиться к @gbl
и получат одинаковое значение
т.е. первый процесс блокирует
изменяет, второй ждет
первый снимает локи идет к выполнение строчки с получением номера, второй ставит лок, интекрементирует, снимает лок и идет к получению номера
и оба процесса получают один номер
...
Рейтинг: 0 / 0
Откат глобалов
    #36447115
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovРазница в том, что $I() позволяет отказаться от блокировки.
Таки она там "внутри себя" её (блокировку) и делает... Т.ч. никакой потери защищённости у автора нет.

Alexey MaslovТ.е., 1 команда вместо 3 в предыдущем варианте.
И не более того...
Но минус будет еще и в том, что "нарастить" при использовании инкркмента ($i()) ничего не получится... Придется опять таки возвращаться к примеру автора...
...
Рейтинг: 0 / 0
Откат глобалов
    #36447132
berumin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaAlexey MaslovРазница в том, что $I() позволяет отказаться от блокировки.
Таки она там "внутри себя" её (блокировку) и делает... Т.ч. никакой потери защищённости у автора нет.

насколько я понимаю, речь идет о том где получать в локальную переменную ID, полученную инкрементом
- внутри lock
- или снаружи
...
Рейтинг: 0 / 0
Откат глобалов
    #36447140
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beruminно два процесса одновременно могут обратиться к @gbl
и получат одинаковое значение
Это уже какой-то нонсенс...
"Обратиться" т.е. читать могут все процессы. Но получить одинаковые номера никак не могут. Иначе бы у нас нумерация карточек полетела бы под откос.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
TEST
 s name=$na(^tmp)
 l +@name
 s @name=$g(@name)+ 1 
 // тут можно еще много чего делать если нужно
 l -@name
 w !,@name
 q

Не должны разные процессы вывести на экран одинаковые числа.

Код: plaintext
1.
2.
3.
[src]TEST
 s name=$na(^tmp)
 w !,$i(@name)
 q
[/src]
Аналог Alexey Maslov . Но "развития" в этом варианте не получится...
...
Рейтинг: 0 / 0
Откат глобалов
    #36447155
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beruminнасколько я понимаю, речь идет о том где получать в локальную переменную ID, полученную инкрементом
- внутри lock
- или снаружи
Без блокировки будет полная не разбериха в нумерации... А с блокировкой только один процесс (блокирнувший первым) получит т.с. доступ к телу. Все остальные будут получать его (доступ) по некой очереди... Но никак все вместе.
...
Рейтинг: 0 / 0
Откат глобалов
    #36447161
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже вот так нужно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
TEST
 s name=$na(^tmp)
 l +@name
 s @name=$g(@name)+ 1 
 // тут можно еще много чего делать если нужно
 w !,@name
 l -@name
 q
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Откат глобалов
    #36447169
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому как в начальном варианте таки может уже показать значение от другого процесса, т.к. блокировка-то уже снята и мог пройти следующий инкремент...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Откат глобалов
    #36447188
berumin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaberuminно два процесса одновременно могут обратиться к @gbl
и получат одинаковое значение
Это уже какой-то нонсенс...
"Обратиться" т.е. читать могут все процессы. Но получить одинаковые номера никак не могут. Иначе бы у нас нумерация карточек полетела бы под откос.

все зависитот нагрузки и влияния фазы луны.
я не знаю как уж точно реализовано внутри каше, но теоретически
Код: plaintext
1.
2.
3.
4.
 1 . l +@gbl
 2 . s @gbl=@gbl+ 1 
 3 . l -@gbl
 4 . s localvar=@gbl
процесс 1 ставит лок (1)
процесс 2 ждет снятия лока (1)
процесс 1 делает инкремент и снимает лок (2,3) переходит к (4)
процесс 2 получает свобождение лока (1) и выполняет инкремент (2,3) и переходит к (4)
платформа i386 так или иначе однопользовательская... две задачи все равно не поделят один винчестер (тут хоть спорить не будем ? ;-) )
в итоге существует вероятность того что две задачи на шаг(4) прийдут одновременно (или один процесс будет на шаге 4, второй успеет выполнить шаг 2)
и оба процесса получают одинаковое значение @gbl
а если мы команду (4) перенесем перед (3) то локальную переменную мы заполним внутри лока, тем самым не дадим возможность изменения @gbl другим процессом на период считывания значение с винчестера (бд)
...
Рейтинг: 0 / 0
Откат глобалов
    #36447209
berumin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

итого подходящий вариант
Код: plaintext
1.
2.
3.
4.
l +@gbl
s @gbl=@gbl+ 1 
s localvar=@gbl
l -@gbl

я так понимаю мы объясняли одно и тоже, но разными словами ...

но к конкретной проблеме (топику) это отношения все-таки не имеет
...
Рейтинг: 0 / 0
Откат глобалов
    #36447217
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
berumin , я же уже писал, что пункты 3 и 4 нужно обязательно (!) поменять местами!
Поскольку блокировка уже снята - другие процессы меняют значение и уже что будет присвоено локальной переменной знает только Кащей.
...
Рейтинг: 0 / 0
Откат глобалов
    #36447221
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beruminя так понимаю мы объясняли одно и тоже, но разными словами ...
Ага...
...
Рейтинг: 0 / 0
Откат глобалов
    #36447232
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
berumin , так, на всякий случай... Проверку целостности БД давно делали? Может из-за какого разрушения там чего-то пошаливает?
...
Рейтинг: 0 / 0
Откат глобалов
    #36447271
berumin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
krvsa berumin , так, на всякий случай... Проверку целостности БД давно делали? Может из-за какого разрушения там чего-то пошаливает?
я ж говорю, случается по непонятным законам... пару раз удавалось "быстро" снять базы (сделать копии) и посмотреть что в них, при этом бд были целыми.
просто ситуация - делается расходный документ, снимается с остатков товар , документ печатается - все это в разных стадиях (и разные вызовы) на delphi и занимает минуту/другую. Т.е. документ сформирован, есть итд... а в следующий момент - товар на остатке, документа нет.
процедур уничтожения документов в прикладной задаче нет.
при этом висит еще процесс который выдергивает данные для другой БД - так вот один раз получилось взять бд где было видно что был документ , была с ним работа, и потом он просто исчез.
Сорри что повторяюсь в описании проблемы.
ps спасибо за внимание
...
Рейтинг: 0 / 0
Откат глобалов
    #36450293
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если такое происходит регулярно, то вычислить думаю возможно, может где-то в коде у вас вдруг стоит TROLLBACK, который и откатит все это

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

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

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

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
Откат глобалов
    #36451196
cache hit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
berumin
я ж говорю, случается по непонятным законам... пару раз удавалось "быстро" снять базы (сделать копии) и посмотреть что в них, при этом бд были целыми.


Все же прогоните проверку целостности. Буквально пару дней назад я тоже разбирался, почему $O зацикливается на одном из подузлов глобала. Оказалось что база битая...
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Откат глобалов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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