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

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

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

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

заранее благодарен за ответ(ы)
...
Рейтинг: 0 / 0
03.02.2010, 10:41
    #36446355
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
Пропадать не пропадало ничего пока... Вот появлялось порой с задержкой - это бывало...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
03.02.2010, 10:47
    #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
03.02.2010, 12:03
    #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
03.02.2010, 12:28
    #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
03.02.2010, 12:45
    #36446791
berumin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
beruminДобрый день.
переодически (достаточно редко) происходит откат глобалов - изменения просто исчезают,
при этом в программе транзакции не используются вообще.

хотел дополнить...
журналирование глобалей я не включал, если смотреть через панель управления, локальные БД, области, глобалы - галка журналирование не стоит.
но были случаи - повреждения БД , в этом случае откат глобалов мог быть достаточно большим - до полдня работы и это происходило после перезапуска каше: в момент его остановки.
но тут хоть как-то логично объяснимо, а тут откат в процессе работы без каких-либо "но"
...
Рейтинг: 0 / 0
03.02.2010, 12:46
    #36446794
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
Что тут скажешь... Если глобала нет, значит сущестует программный код, который его почистил. К тому же IDGoods вычисляется вне приведенного фрагмента. Ловить такие ошибки, тем более в Cache 4, действительно, тяжело. Там только отладчик в командной строке. Почитайте док-ю, помнится была возможность трассировки выполнения команд.
...
Рейтинг: 0 / 0
03.02.2010, 12:56
    #36446826
berumin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
Alexey MaslovЧто тут скажешь... Если глобала нет, значит сущестует программный код, который его почистил. К тому же IDGoods вычисляется вне приведенного фрагмента. Ловить такие ошибки, тем более в Cache 4, действительно, тяжело. Там только отладчик в командной строке. Почитайте док-ю, помнится была возможность трассировки выполнения команд.
программного кода уничтожения документа нет в проекте. только обнулить документ, но удаления нет.
нумерация документов - простой инкремент - пропусков в нумерации тоже нет.
IDGoods - в принципе массив с кодами товаров.
Если бы я мог повторить "баг" - то понятно кто был бы виноват, а так ... есть н-цать установок прикладного ПО - переодически - где-то пропадает документ таким образом... может один, может два за месяц.. но при этом документов тысячи. если был бы виноват программный (прикладной) код - то эффект был бы каким-то более постоянным.
на каком-то форуме читал был "баг" в каше связанные с реакцией на транзакцию во время перевода системного времени.
...
Рейтинг: 0 / 0
03.02.2010, 13:42
    #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
03.02.2010, 13:46
    #36447015
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
Разница в том, что $I() позволяет отказаться от блокировки. Т.е., 1 команда вместо 3 в предыдущем варианте.
...
Рейтинг: 0 / 0
03.02.2010, 13:47
    #36447022
berumin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
krvsa,

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

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

насколько я понимаю, речь идет о том где получать в локальную переменную ID, полученную инкрементом
- внутри lock
- или снаружи
...
Рейтинг: 0 / 0
03.02.2010, 14:19
    #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
03.02.2010, 14:22
    #36447155
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
beruminнасколько я понимаю, речь идет о том где получать в локальную переменную ID, полученную инкрементом
- внутри lock
- или снаружи
Без блокировки будет полная не разбериха в нумерации... А с блокировкой только один процесс (блокирнувший первым) получит т.с. доступ к телу. Все остальные будут получать его (доступ) по некой очереди... Но никак все вместе.
...
Рейтинг: 0 / 0
03.02.2010, 14:24
    #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
03.02.2010, 14:26
    #36447169
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
Потому как в начальном варианте таки может уже показать значение от другого процесса, т.к. блокировка-то уже снята и мог пройти следующий инкремент...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
03.02.2010, 14:29
    #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
03.02.2010, 14:33
    #36447209
berumin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
krvsa,

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

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

но к конкретной проблеме (топику) это отношения все-таки не имеет
...
Рейтинг: 0 / 0
03.02.2010, 14:34
    #36447217
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
berumin , я же уже писал, что пункты 3 и 4 нужно обязательно (!) поменять местами!
Поскольку блокировка уже снята - другие процессы меняют значение и уже что будет присвоено локальной переменной знает только Кащей.
...
Рейтинг: 0 / 0
03.02.2010, 14:35
    #36447221
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
beruminя так понимаю мы объясняли одно и тоже, но разными словами ...
Ага...
...
Рейтинг: 0 / 0
03.02.2010, 14:37
    #36447232
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
berumin , так, на всякий случай... Проверку целостности БД давно делали? Может из-за какого разрушения там чего-то пошаливает?
...
Рейтинг: 0 / 0
03.02.2010, 14:48
    #36447271
berumin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
krvsa
krvsa berumin , так, на всякий случай... Проверку целостности БД давно делали? Может из-за какого разрушения там чего-то пошаливает?
я ж говорю, случается по непонятным законам... пару раз удавалось "быстро" снять базы (сделать копии) и посмотреть что в них, при этом бд были целыми.
просто ситуация - делается расходный документ, снимается с остатков товар , документ печатается - все это в разных стадиях (и разные вызовы) на delphi и занимает минуту/другую. Т.е. документ сформирован, есть итд... а в следующий момент - товар на остатке, документа нет.
процедур уничтожения документов в прикладной задаче нет.
при этом висит еще процесс который выдергивает данные для другой БД - так вот один раз получилось взять бд где было видно что был документ , была с ним работа, и потом он просто исчез.
Сорри что повторяюсь в описании проблемы.
ps спасибо за внимание
...
Рейтинг: 0 / 0
04.02.2010, 17:23
    #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
05.02.2010, 10:12
    #36451196
cache hit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат глобалов
berumin
я ж говорю, случается по непонятным законам... пару раз удавалось "быстро" снять базы (сделать копии) и посмотреть что в них, при этом бд были целыми.


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


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