Вылет 1С SQL при одновременном создании документов #512624


#0 by NS
Вылетают пользователи. В момент записи и проведения документов. (Заявка покупателя) При этом в журнале регистраций видно одновременное создание документов, один из создавших при этом выживает, второго в момент нажатия ОК выкидывает с ошибкой приложения. С чем это связано? Обоим документам присваивается одинаковый внутренний код? Как это можно обойти?
#1 by SnarkHunter
Похоже на дедлок...
#2 by NS
В какой момент? Вылет то не в момент создания, а намного позже. А одновременное именно создание. Всегда, во всех отслеженных случаях.
#3 by NS
И вылет не с дидлоком, и в SQL-е включено логгирование, и нет дидлока.
#4 by NS
Я наверно сделаю на блокировке служебного справочника. В вводнового - заблокирую, вопрос когда и как разблокировать?
#5 by Mikeware
А что пишет при вылете? Что пишет в трассировке?
#6 by NS
Смоделировать не получается, получается посмотреть скриншот. В журналах ничего нет. Вылет - Ошибка приложения, исключение 0xc0000005  в приложении по адресу 0x1f208b71
#7 by Mikeware
ну, поставь писаться трассу... И пусть точное время вылета запишут. Ну, и ПИД процесса пиши им при запуске. Пусть тоже сообщат.
#8 by NS
На сутки парализовать работу фирмы?
#9 by Mikeware
Это скуяли™?
#10 by NS
я тебя не понимаю. точное время вылета известно.
#11 by NS
Вылет раз в сутки. То есть я на сутки включу на SQL-е трассировку.
#12 by Mikeware
и трасса есть? Ну тогда и смотри, что пытался сделать процесс, который отвалился...
#13 by Mikeware
Ну, я как-то трое суток писал. И ничего :-) контора работает в режиме 24*7
#14 by NS
Тоже самое, только многие тысячи документов в день. Откуда есть, если я не могу её включить, ибо параллизую работу.
#15 by Torquader
Скорей всего проблема при блокировке файла - как известно, SQL-версия всё равно в директории создаёт файлы и что-то в них блокирует (чтоб ей там пусто было - в SQL реализовать поленились). Далее, если с блокировкой файла что-то не так (сеть сглючила и т.п.), то имеем проблемы.
#16 by Mikeware
При этом нет вылета
#17 by NS
Вопрос, почему вылет только при одновременном создании двумя операторами документа одного вида, и вылет не в момент создания! А в момент записи.
#18 by Mikeware
если "сеть сглючила" - он получит "объект <а тут вновь созданый объект> заблокирован".  Как с этим бороться - проскакивает периодически - ума не прриложу. Началось повторно месяц назад, и уже все перепроверили - найти не можем
#19 by Torquader
На одной машине или на разных ?
#20 by Mikeware
вопрос даже не в этом. Вопрос в том - почему именно вылет без всяких внятных сообщений...
#21 by NS
На разных, все работают в терминале. Оследил три вылета - каждый раз в момент сохранения заявки, которая была создана с одновременным созданием заявки другим пользователем (не запись одновременная, а создание). Оследил по жруналу регистраций несколько одновременных созданий заявки - каждый раз вылет пользователя. Есно не сразу, а в момент записи заявки.
#22 by NS
В сделано предположение.
#23 by Mikeware
ну и поставь в трассе фильтр - посмотришь, вообще до инсерта в 1сджорнал дело доходит или нет...
#24 by Torquader
Вылет без внятных сообщений бывает, если наблюдаются какие-то проблемы с внутренней структурой данных в 1С. Например, если переполнить стек вызовов, то приложение закроется аварийно. Если же мы читаем-пишем память, которая ещё не выделена (или уже свободна), то получаем сообщение об ошибке доступа. Кстати, а номера заявок получаются совпадающими ?
#25 by Torquader
Что касается внутреннего кода: Внутренний код, насколько я знаю, присваивается не в момент создания документа, а в момент его записи. То есть, если создан новый документ, то он известен только данному клиентскому сеансу, для другого сеанса его нет. Другое дело, что при записи документа должна проверяться уникальность номера документа (а проверяется ли она), если нет, то в SQL-вполне вероятно, что индекс уникальный. Теперь, когда мы что-то пишем в базу, то SQL нам напоминает, что нельзя записать два документа с одинаковым номером - и второй всегда "отваливает с ошибкой". Проверить можно просто на тестовой базе - присвоить одинаковые номера при помощи "DocNum=1" и попробовать записать - если второго записывающего "отвалит", то мы поняли в чём дело.
#26 by Mikeware
не путай ид и код.
#27 by NS
Да, в момент создания (в журнале регистраций) в момент записи они уже разные.
#28 by Torquader
Таки что там путать - у документа вообще кода нет. А по какой причине меняется номер документа ?
#29 by NS
В коде прописано, ибо до этого были дубли.
#30 by Эльниньо
Откуда же периодически появляются Айди-двойники?
#31 by Mikeware
от индексов
#32 by NS
Одновременное создание поборол, черз блокировка на служебном элементе справочника. Сидели рядом на двух машинах, удалось одновременно создать с 20-го раза на копии, делали на счет три. Интересно, как операторы-то умудряются раз в сутки сопасть? Или идут какие-то блокировки, и дает им создаться одновременно?
#33 by Torquader
Семёрка при создании нового документа не присваивает ему ID - только номер. Номер хранится в таблице открытых документов, а ID присваивается только в момент записи. Если где-то выполняется блокировка журнала и т.п., то новый документ будет создан только после снятия этой блокировки - причём вероятность совпадения возрастает. Открой транзакцию, поменяй что-то, и жди несколько секунд (2-3 чтобы не вывалилось с ошибкой), а за это время на двух других клиентах создай документ - и посмотри, что происходит.
#34 by NS
Не удается сделать документы с одинаковым номером в момент создания. Ну никак. На такое способны только операторы. В любом случае думаю что проблему я решил.
#35 by NS
Да, так, блокировкой  легко получается создать два документа одновременно. Только добиться вылета в тестах не получается.
#36 by NS
ла точно из-за одновременного создания. Ибо вот такой кусок в ВводНового, и и в ВводНаОсновании (с отпусканием блокировки в конце процедуры приоткрытии) Проблему полностью решил. Если  глслужспр1.блокировка=0 тогда статусвозврата;
#37 by МихаилМ
уверен. у вас скл >=2005
#38 by 1Сергей
+ паченный
#39 by NS
Да, 2000-ый. Со всеми официальными патчами.
#40 by NS
Я многократно писал в ветках как я отношусь к >2000 под семерку.
#41 by МихаилМ
Вы еще и шахматнымими программами уликались. никто не обязан читать ваши ветки. Вы не звезда.
#42 by NS
Хочется поскандалить? Вы тоже в Уверены, но жестоко ошиблись. И вы тоже не звезда.
#43 by toypaul
скорее всего это связано с получением номера документа
#44 by NS
Но почему вылет не в момент получения номера, а момент записи?
#45 by toypaul
хотя нет. там индекс включает row_id
#46 by NS
Круто, второй Гений1С.
#47 by toypaul
как это почему? потому что конфликт уникальности при записи происходит, а не при чтении.
#48 by NS
Номер документа уникальный на скриншоте вылета. Присвоенный согласно префикса фирмы (не тот, который в момент создания по ЖР)
#49 by МихаилМ
покажите скриншот вылета. симтомы похожи описаны 1с77 + мкл 2005. лечение описано на скрипт-кодинг по-моему был патч 1с77 для решения этой проблемы. если получается воспоизвести ситуацию то проблему, скорее всего, удасться диагностировать с помощью скл профайлер.
#50 by NS
Спасибо. Скриншот попробую отсканировать. Воспроизвести ситуацию на копии не удалось. На рабочей базе к субботе вылетало уже по несколько раз в сутки, скриншот удалось сделать только один, но остальные случаи - было записано точное время, в ЖР во всех случаях при этом создание в одно время документа, у второго всё ОК, у первого вылет. Кроме заплатки был отключен контроль уникальности, но номер присваивается в момент выбора фирмы, а не в момент создания, поэтому есть уверенность что он был уникальным. Плюс на скриншоте смерти он уникальный.
#51 by МихаилМ
плавающие ощибки - самые неприятные. особенно с учетом  их увеличения скорости появления. попробуйте мониторить с помощью скл профайлера. на моей памяти нет подобных проблем. просматриваю форумы т1с с 2001 года,   мисты - с 2004. надо понять что изменилось до периода с начала диагностики: урбд, репликация, вставка данных прямыми запросами. те возможно происходит рассинхронизация с таблицей зарезервированных номеров  по причине отключенной блокировки. и с возрастанием количества вводимых документов папалельно мб проблемы. эксплуатаровал 1с77 + скл 2000 + габкие блокировки. 250 пользователей. такой проблемы не было. зато были 1с77 + скл 2005. вместо апа.
#52 by NS
Сейчас то ошибки нет. Не буду же я её возвращать. Тут проблема не в количество пользователей (их меньше 50), а в огромном количестве ежедневных документов. Блокировки не отключены. Стоит компонента Ромикса которая дает таймаут по блокировке. (время ожидания транзакции в 0 - шокирует пользователей) Скриншот отсканировал, сейчас выложу. Вылет начался после изменения модуля в приоткрытии, при вводе на основании для проблемных клиентов было сделано вычисление текущего долга, и выведено предупреждение с таймаутом. То есть процесс открытия документа замедлился.
#53 by NS
Вот скриншот
#54 by Z1
Делай свои вычисления не в Процедуре приОткрытиии а в ПослеОткрытия ( процентов на 90 что все пропадет ) Также ничего не было сказано док Заява проводится или нет. Если док проводиться то Проводится ли при первой запист.
#55 by МихаилМ
не могу собразить, как влияет задержка при окрытии на проверку уникальности номенора(мбпроблема и не в номере).   поробуйте предупреждение вынести  в обрабокаожидания задержка(опоздание) в ~1 сек должна быть не критична.
#56 by NS
ПослеОткрытия в семерке? Док в базе не появляется, значит даже запись не производится, на ней вылетает. Так проблема ведь решена. Зачем менять? Теперь до сути, из-за чего она происходит хотелось бы докопаться. Я думаю что проблема не в номере.
#57 by МихаилМ
предположительно проблема возникает , когда происходит запись одинаковых полей в поле с признаком уникальности. есть только 2 таких поля в таблице токумента 1сджорнал 1с77 под рукой нет, поэтому имя поля и индекса поскащать не могу. поэтому поле номера документа более вероятно, чеи ид документа.
#58 by Z1
>>>С чем это связано? Обоим документам присваивается >>>>одинаковый внутренний код? Как это можно обойти? Назовите точное колонки и таблицы поля внутреннего кода а то если чесно не уверен что точно понимаю о каком поле речь.
#59 by Z1
выкидывай блокировка и заменяй их на пользовательские блокировки sql ( которые на уровне сессий ). Твои "глслужспр1.блокировка" при интенсивной нагрузке дают сбои.
#60 by NS
У меня в нескольких местах такие блокировки, ни одного сбоя за последний год из-за них. Пример сбоя который они могут дать? На этих же блокировках сделан уникальный код, я запускал для теста 10 процессов с непрерывным формированием уникального кода - без сбоев, без пропусков кода, без дуюдей, и без проблем.
#61 by Z1
(60 ) Я же написал в 59 ИХМО. Основа этих блокировок файловая.блокировка она может не поспеть за множеством sql блокировок. Ответь на
#62 by NS
Я сам не знаю, поэтому и спрашиваю. Насчет сбоя, для штрихкода используется уникальный код. В глобальнике вот такая процедура. Текущий номер  1 455 256 Сбоев не было, ни одного дубля, ни одного пропуска, ни одного вылета, все вылеты были определены причины (до этого - дидлоки на справочнике договора), не определены причины только текущего вылета, хотя ситуация исправлена.
#63 by Z1
Ну если  Вы не знаете  что означает фраза >>>Обоим документам присваивается одинаковый внутренний код то я тем более не могу этого знать. Где дальше используется этот код  ??? При выполнении кода : идет блокировка таблицы констант. с точки зрения интенсивной работы пользователей код лучше переписать так
#64 by toypaul
компоненту ромиска надо было попробовать убрать для начала :)
#65 by NS
Низзя :( Либо нужен другой выход, но это всё намного хуже. Этот код выполняется настолько быстро, что блокировка ни на что не влияет.
#66 by NS
он остался от предыдущего, как раз глючного способа - попытки блокировки таблицы констант.
#67 by Z1
>>>> Этот код выполняется настолько быстро, >>>> что блокировка ни на что не влияет. Абсолютно неправильное утверждение. Если я заблокирую таблицу констант то этот код остановиться до тех пор пока не будет снята блокировка. Р реальности все гораздо лучше но весь код из при интенсивной многопользовательской нагрузке может вести себя непредсказуемо.
#68 by Z1
весь код из можно заменить на гораздо лучший с точки зрения sql CONSTRAINT PK0_Table_X  PRIMARY KEY (id) ) В таблице одна строка Далее читаем значение
#69 by NS
Начатьтранзакцию - Зачем лишние транзакции в базе?
#70 by МихаилМ
нет в коде лишних транзакций. но нет и обработки ситуации, когда заблокировать не удалось.
#71 by NS
Так у меня код совсем без транзакций, а предлагается заменить его на код с транзакцией.
#72 by МихаилМ
прелогается заменить один механиз на другой. транзакция - это не блокировка работы всех пользователей. на сайте софт поинта есть статья (рекламная) замена файловых блокировок на скл-ные скорее всего там же описано зачем это надо.
#73 by AhtungG
в нашей базе тоже каждый день юзеров из несохраненной ЗаявкаПокупателя выкидывало. Вопрос закрыли, добавив      КонецЕсли; Таким образом - тема закрылась. Чем быстрее документ будет записан, тем меньше на подобный 'вылет'.
#74 by Mikeware
Кстати, была подобная проблема - отваливание вайлов блокировки, в основном журнального. ПОтом - пропало. ПОсле очередного пакета обновления от мелкомягких - опять появилась, и месяц уже преследует...
#75 by AhtungG
дополнение к . На вопрос Записать заявку (Да-Нет?) юзеры иногда отвечают нет (когда им нужно 'прикинуть по сумме черновик'), поэтому лишних заявок в базе наша команда Записать не плодит.
#76 by Torquader
А почему через константу ? Лучше сделать отдельный справочник с одним элементом, который тоже будет изменяться и записываться. Тогда гарантировано - сеансы будут ждать друг-друга только тогда, когда они обращаются к этому элементу. В случае же констант - "все яйца в одной корзине" и изменение какой-то константы блокирует выполнение изменений всех остальных констант.
#77 by Mikeware
+ или периодики зы. я вообще константы кэширую. Долго с ними работать...
#78 by NS
В системе только одна константа изменяется.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С