Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Конфликт блокировок при выполнении транзакции          
Мичман Харитонов Подменю пользователя
сообщение 21.02.20, 13:01
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 164
Из: м. Кам'янське
Спасибо сказали: 26 раз
Рейтинг: 0

Платформа 8.3.7.18.60
База самописная
В определенный момент без видимой причины (в тот день изменения в конфигурацию не вносились, был в командировке), начались проблемы с конфликтом блокировок.
С утра работает нормально, потом каждые пару часов приходится перезагружаться или перезапускать службы.
Пишет "По причине.... ошибка выполнения запроса." При чем, сам запрос простенький

Запрос.Текст = 
        "ВЫБРАТЬ
        |    ТоварыОтгруженные.Фирма КАК Фирма,
        |    ТоварыОтгруженные.ДокументПродажи,
        |    ТоварыОтгруженные.ДокументПродажи.Дата,
        |    ТоварыОтгруженные.Номенклатура КАК Номенклатура,
        |    ТоварыОтгруженные.СуммаОстаток КАК Сумма,
        |    ТоварыОтгруженные.Договор
        |ИЗ
        |    РегистрНакопления.ТоварыОтгруженные.Остатки(&МоментВремени, Контрагент = &Контрагент) КАК ТоварыОтгруженные
        |
        |УПОРЯДОЧИТЬ ПО
        |    Фирма,
        |    ТоварыОтгруженные.ДокументПродажи.Дата";
        
        Выборка = Запрос.Выполнить().Выбрать();

Подскажите пожалуйста, что могло случиться?

fly Подменю пользователя
сообщение 21.02.20, 13:11
Сообщение #2

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 234
Спасибо сказали: 51 раз
Рейтинг: 48

Цитата(Мичман Харитонов @ 21.02.20, 13:01) *
&МоментВремени


&МоментВремени - и где момент времени?
&Контрагент - ну и Контрагент

Сообщение отредактировал fly - 21.02.20, 13:11

Мичман Харитонов Подменю пользователя
сообщение 21.02.20, 13:18
Сообщение #3

Завсегдатай
****
Группа: Пользователи
Сообщений: 164
Из: м. Кам'янське
Спасибо сказали: 26 раз
Рейтинг: 0

Понял. Вот полностью
//Новая версия, попытка увеличить скорость процедуры
    Если Истина Тогда
        
        Запрос = Новый Запрос;
        ТекстЗапроса = "ВЫБРАТЬ
                       |    ОграниченияОтгрузок.Фирма,
                       |    ОграниченияОтгрузок.Контрагент КАК Контрагент,
                       |    ОграниченияОтгрузок.Номенклатура КАК Номенклатура,
                       |    ОграниченияОтгрузок.ДнейОтсрочки КАК ДнейОтсрочки
                       |ИЗ
                       |    РегистрСведений.ОграниченияОтгрузокКонтрагентам.СрезПоследних(
                       |            &МоментВремени,
                       |            Контрагент = &Контрагент
                       |                ИЛИ Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК ОграниченияОтгрузок";
        Запрос.Текст = ТекстЗапроса;
        Запрос.УстановитьПараметр("Контрагент", Контрагент);
        Запрос.УстановитьПараметр("МоментВремени", МоментВремени);
        тзОграниченияОтгрузок = Запрос.Выполнить().Выгрузить();
        тзОграниченияОтгрузок.Индексы.Добавить("Фирма, Контрагент, Номенклатура");
        
        НайденнаяСтрока = тзОграниченияОтгрузок.Найти(Контрагент, "Контрагент");
        Если НайденнаяСтрока <> Неопределено Тогда
            ЕстьОтсрочкиКонтрагенту = Истина;
        КонецЕсли;
        
        БуфферОграничений = тзОграниченияОтгрузок.СкопироватьКолонки("Фирма, Номенклатура, ДнейОтсрочки");
        СуммыПросроченнойЗадолженностиКонтрагентаПоФирмам = Новый Соответствие;
        МаксимальнаяОтсрочка = 0;
        ПредоплатаПоДоговору = Истина;
        
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ТоварыОтгруженные.Фирма КАК Фирма,
        |    ТоварыОтгруженные.ДокументПродажи,
        |    ТоварыОтгруженные.ДокументПродажи.Дата,
        |    ТоварыОтгруженные.Номенклатура КАК Номенклатура,
        |    ТоварыОтгруженные.СуммаОстаток КАК Сумма,
        |    ТоварыОтгруженные.Договор
        |ИЗ
        |    РегистрНакопления.ТоварыОтгруженные.Остатки(&МоментВремени, Контрагент = &Контрагент) КАК ТоварыОтгруженные
        |
        |УПОРЯДОЧИТЬ ПО
        |    Фирма,
        |    ТоварыОтгруженные.ДокументПродажи.Дата";
        
        Выборка = Запрос.Выполнить().Выбрать();

fly Подменю пользователя
сообщение 21.02.20, 13:26
Сообщение #4

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 234
Спасибо сказали: 51 раз
Рейтинг: 48

Цитата(Мичман Харитонов @ 21.02.20, 13:01) *
"По причине.... ошибка выполнения запроса."

ну как бы желательно причину

и непосредственно, переменные МоментВремени и Контрагент код где определяется

Мичман Харитонов Подменю пользователя
сообщение 21.02.20, 13:32
Сообщение #5

Завсегдатай
****
Группа: Пользователи
Сообщений: 164
Из: м. Кам'янське
Спасибо сказали: 26 раз
Рейтинг: 0

Этот код в процедуре Общего модуля, МоментВремени и Контрагент передаются из документа, в котором происходит проверка задолженности
Сообщение об ошибке вот

fly Подменю пользователя
сообщение 21.02.20, 13:49
Сообщение #6

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 234
Спасибо сказали: 51 раз
Рейтинг: 48

Мичман Харитонов @ Сегодня, 13:32 * ,
В управляемом режиме блокировки, при выполнении запроса данные не блокируются.
Посмотрите, какой режим блокировки установлен на регистре и документе.

Спасибо сказали: 80505177719@ukr.net,

Мичман Харитонов Подменю пользователя
сообщение 21.02.20, 14:01
Сообщение #7

Завсегдатай
****
Группа: Пользователи
Сообщений: 164
Из: м. Кам'янське
Спасибо сказали: 26 раз
Рейтинг: 0

Автоматический режим, на всей конфигурации.


Толстый клиент

Допустим, если запустить Тестирование и Исправление, то базе, полегчает (насколько - сложный вопрос, но все же)?

fly Подменю пользователя
сообщение 21.02.20, 14:07
Сообщение #8

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 234
Спасибо сказали: 51 раз
Рейтинг: 48

Цитата(Мичман Харитонов @ 21.02.20, 14:01) *
тестирование и Исправление, то базе, полегчает (насколько - сложный вопрос, но все же)?

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

Сообщение отредактировал fly - 21.02.20, 14:08

Спасибо сказали: 80505177719@ukr.net,

Мичман Харитонов Подменю пользователя
сообщение 21.02.20, 14:12
Сообщение #9

Завсегдатай
****
Группа: Пользователи
Сообщений: 164
Из: м. Кам'янське
Спасибо сказали: 26 раз
Рейтинг: 0

Просто не знаю, на что думать.
Эта конструкция работает... давно, больше двух лет.
А в прошлую пятницу случилось вот такое

fly Подменю пользователя
сообщение 21.02.20, 15:16
Сообщение #10

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 234
Спасибо сказали: 51 раз
Рейтинг: 48

Мичман Харитонов @ Сегодня, 14:12 * ,
Таблицы данных увеличиваются, в итоге может появиться "избыточная блокировка" (обычно этот эффект появляется при параллельном проведении документов, во время него самым первым документом блокируется большой объем записей регистров на все время проведения документа).
В автоматическом режиме в транзакциях используется уровень изоляции SERIALIZABLE (запрещает чтение и запись).
В управляемом режиме в транзакциях используется уровень изоляции ReadCommitted (запрещает запись и проверяет нет ли в этот момент параллельных записей, после завершения запроса блокировки снимаются не дожидаясь завершения транзакции).

Обычно лечение начинают переводом конфигурацию из «Автоматического» режима управления блокировкой данных в «Управляемый» (лично не встречал стандартные Конфигурации от 1С в режиме "Автоматического" режима блокировок, все шли в "Управляемом"), и транзакции начнут выполняться на уровне изоляции типа ReadCommitted, вместо SERIALIZABLE или Repeatable Read.

Если далее вдаваться в детали. то нужно идти SQL Server Profiler....... что точно уже дебри, но почитать можете, полезная вещь.

fly @ Сегодня, 14:56 * ,
..... бла/бла/бла про SQL - в итоге все завершается процессами "поиска" и "оптимизации".
Смыла нет выгружать ТЗ потом индексировать, находить строку, и уже по строке определять если найдена = есть отсрочка, не найдена = нет отсрочки.
А потом брать и копировать таблицу без колонки Контрагент.
достаточно просто проверить свойство РезультатаЗапроса - Пустой() - возврат Булево, если пустой - отсрочки нет.
И сразу результат выгрузить в итоговую таблицу и т.д.


Запрос = Новый Запрос;
        Запрос.МенеджерВременныхТаблиц = новый МенеджерВременныхТаблиц;
        ТекстЗапроса = "ВЫБРАТЬ
                       |    ОграниченияОтгрузок.Фирма,
                       |    ОграниченияОтгрузок.Номенклатура КАК Номенклатура,
                       |    МИНИМУМ(ОграниченияОтгрузок.ДнейОтсрочки) КАК ДнейОтсрочки,
                       |    СУММА(ВЫБОР КОГДА ОграниченияОтгрузок.Контрагент = &Контрагент ТОГДА 0 ИНАЧЕ 1 КОНЕЦ) КАК ЕстьОтсрочка
                       |    
                       |ИЗ
                       |    РегистрСведений.ОграниченияОтгрузокКонтрагентам.СрезПоследних(
                       |            &МоментВремени,
                       |            Контрагент = &Контрагент
                       |                ИЛИ Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК ОграниченияОтгрузок
                       |     СГРУППИРОВАТЬ ПО
                       |      ОграниченияОтгрузок.Фирма,
                       |    ОграниченияОтгрузок.Номенклатура КАК Номенклатура";
        Запрос.Текст = ТекстЗапроса;
        Запрос.УстановитьПараметр("Контрагент", Контрагент);
        Запрос.УстановитьПараметр("МоментВремени", МоментВремени);
        БуфферОграничений = Запрос.Выполнить();

        Если БуфферОграничений.Итог("Фирма") > 0 Тогда
            ЕстьОтсрочкиКонтрагенту = Истина;
        КонецЕсли;
        
                СуммыПросроченнойЗадолженностиКонтрагентаПоФирмам = Новый Соответствие;
        МаксимальнаяОтсрочка = 0;
        ПредоплатаПоДоговору = Истина;
        
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ТоварыОтгруженные.Фирма КАК Фирма,
        |    ТоварыОтгруженные.ДокументПродажи,
        |    ТоварыОтгруженные.ДокументПродажи.Дата,
        |    ТоварыОтгруженные.Номенклатура КАК Номенклатура,
        |    ТоварыОтгруженные.СуммаОстаток КАК Сумма,
        |    ТоварыОтгруженные.Договор
        |ИЗ
        |    РегистрНакопления.ТоварыОтгруженные.Остатки(&МоментВремени, Контрагент = &Контрагент) КАК ТоварыОтгруженные
        |
        |УПОРЯДОЧИТЬ ПО
        |    Фирма,
        |    ТоварыОтгруженные.ДокументПродажи.Дата";
        
        Выборка = Запрос.Выполнить().Выбрать();


Сообщение отредактировал fly - 21.02.20, 15:43

Спасибо сказали: Мичман Харитонов,

Vofka Подменю пользователя
сообщение 21.02.20, 15:54
Сообщение #11

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Цитата(Мичман Харитонов @ 21.02.20, 14:12) *
В автоматическом режиме в транзакциях используется уровень изоляции SERIALIZABLE (запрещает чтение и запись).

Repeatable read, если не ошибаюсь.

fly Подменю пользователя
сообщение 21.02.20, 16:18
Сообщение #12

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 234
Спасибо сказали: 51 раз
Рейтинг: 48

Vofka @ Сегодня, 15:54 * ,
[необходимо зарегистрироваться для просмотра ссылки]

"ок
я вроде так и написал
repeaable read и serializable


" транзакции начнут выполняться на уровне изоляции типа ReadCommitted, вместо SERIALIZABLE или Repeatable Read."

REPEATABLE READ
Этот уровень используется по умолчанию в MySQL. Добавленные данные уже будут доступны внутри транзакции, но не будут доступны до подтверждения извне.
Здесь может возникнуть теоретическая проблема «фантомного чтения». Когда внутри одной транзакции происходит чтение данных, другая транзакция в этот момент вставляет новые данные, а первая транзакция снова читает те-же самые данные.

fly @ Сегодня, 15:59 * ,
REPEATABLE-READ
каждая блокировка, полученная во время транзакции , удерживается на протяжении транзакции.
READ-COMMITTED
то locks, которые не соответствуют освобождены после заявления завершается.

это где то из описания...

что REPEATABLE-READ - все еще удерживает в транзации строки.
а в запросе - используется Контрагент.ПустаяСтрока() - что может пересекаться с запросом в Другой транзакции, я не очень силен в Транзакциях, но как мне кажется в том числе идет конфликт блокировок

fly @ Сегодня, 16:13 * ,
Table 13-1. Standard SQL Transaction Isolation Levels

Isolation Level - Dirty Read - Nonrepeatable Read - Phantom Read

Repeatable read - Not possible - Not possible - Possible
Serializable - Not possible - Not possible - Not possible

Сообщение отредактировал fly - 21.02.20, 16:22

Vofka Подменю пользователя
сообщение 21.02.20, 16:46
Сообщение #13

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Цитата(fly @ 21.02.20, 16:18) *
repeaable read и serializable

Я видел, что именно так указано в документации, но это звучит странно, т.к. транзакция может выполняться в одном конкретном режиме. И в автоматическом режиме, если я не ошибаюсь, это именно repeatable read, а не serializable.

andr_andrey Подменю пользователя
сообщение 21.02.20, 16:55
Сообщение #14

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 623
Спасибо сказали: 166 раз
Рейтинг: 130.8

Мичман Харитонов @ Сегодня, 13:32 * ,
Из скрина ошибки видны две записи Объекта, что за объекты записываются в "ФормеСписка" и в модуле "ПолныеПрава", странные они?


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

fly Подменю пользователя
сообщение 21.02.20, 16:57
Сообщение #15

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 234
Спасибо сказали: 51 раз
Рейтинг: 48

Vofka @ Сегодня, 16:46 * ,
когда читал, литературу, по этому вопросу так и не нашел для себя ответа:
от чего зависит и какая именно выполняется блокировка Repeatable Read или Serializable....

Автоматический
MS SQL Server
Записей

если все же ставиться по умолчанию - repeatble read... а Serializable - как опция, если очень захотеть.... это одно, а если другие условия влияют.... оставил на потом по мере поступления проблемы.

Сообщение отредактировал fly - 21.02.20, 17:03

Мичман Харитонов Подменю пользователя
сообщение 21.02.20, 17:05
Сообщение #16

Завсегдатай
****
Группа: Пользователи
Сообщений: 164
Из: м. Кам'янське
Спасибо сказали: 26 раз
Рейтинг: 0

andr_andrey @ Сегодня, 16:55 * ,
Да уж... мягко говоря. Человека, который это писал, больше нет... меня взяли на его место, при чем передачи дел толком и не было. Вот, второй год с этим работаю. Потихоньку дописываю-переписываю, но почти вся база такая

andr_andrey Подменю пользователя
сообщение 21.02.20, 17:39
Сообщение #17

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 623
Спасибо сказали: 166 раз
Рейтинг: 130.8

Мичман Харитонов @ Сегодня, 17:05 * ,
Я не придираюсь, просто получается набор блокировок, понять бы какие действительно блокируют запись.


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 17:27
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!