Конфликт блокировок при выполнении транзакции
Всем добрый день! Часто, после того, как я добавляю запрос, начинает периодически появляться ошибка "Конфликт блокировок при выполнении транзакции". Либо при выполнении самого запроса, либо при обращении к объекту, который используется в запросе. Видимо проблемы в запросе. Уже читала по этому поводу, пробовала переписать запрос, но не помогает. Подскажите, пожалуйста, на что нужно обратить внимание?
По теме из базы знаний
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(5)В данном случае Запрос выполняется в процедуре создания задач. Не понятно, почему объект заблокирован, ругается на метод Записать. До этого дрбавляла запрос в процедуру ПередЗаписью документа, тоже была такая ошибка, и периодически повторяется. Именно сейчас нет возможности зафиксировать.
Прикрепленные файлы:
(3)В событие ПередЗаписью добавляла до этого, Сейчас - в процедуру создания задач. Не знаю, какие блокировки, как это узнать? На скрине ошибка и место ошибки в данном случае. Оугается на .Записать, хотя кем он заблокирован и почему, не понятно. Это точно из-за моих изменений, раньше не было вообще такого.
Прикрепленные файлы:
(15) Я бы попробовал для начала две вещи.
1. Переписать запрос для избавление от "ИЛИ" в условии - сделать объединение двух однотипных подзапросов в одном из которых "И" на "Проведен", а в другом "И" на "ПометкаУдаления".
2. Добавить индекс по "Выполнена" (в палитре свойств - "Индексировать")
И первое и второе способно помочь сузить диапазоны внутренних блокировок SQL-сервера при выполнении запроса. Для начала попробуйте первое - оно в любом случае лишним не будет (и это довольно стандартный прием оптимизации критичных запросов, правда больше по производительности, чем по блокировкам). Индекс добавить всегда успеете (и еще не факт, что он окажется достаточно селективным и принесет реальную пользу).
1. Переписать запрос для избавление от "ИЛИ" в условии - сделать объединение двух однотипных подзапросов в одном из которых "И" на "Проведен", а в другом "И" на "ПометкаУдаления".
2. Добавить индекс по "Выполнена" (в палитре свойств - "Индексировать")
И первое и второе способно помочь сузить диапазоны внутренних блокировок SQL-сервера при выполнении запроса. Для начала попробуйте первое - оно в любом случае лишним не будет (и это довольно стандартный прием оптимизации критичных запросов, правда больше по производительности, чем по блокировкам). Индекс добавить всегда успеете (и еще не факт, что он окажется достаточно селективным и принесет реальную пользу).
(15) Только заметил. Выше правильно обратили внимание на обращение через точку к объекту задачи. Это очень неприятный момент, которого следует избегать при разработке архитектуры приложения (аналогичен обращению через точку к реквизитам регистратора). Так как при этом системе приходится делать неявное соединение с таблицами всех объектов, ссылки на которые может содержать объект задачи. Скорее всего основная причина "широкого поля блокировок" как раз в этом.
Идеальное решение - вынести нужный признак в реквизиты самой задачи (менять его при изменении состояния объекта задачи). Тогда этот запрос не будет делать никаких соединений и будет работать только таблицей задач. Вам предложили промежуточный вариант оптимизации, если ваш запрос актуален только для некоторых типов объектов задач из всех возможных. Тогда с помощью ВЫРАЗИТЬ можно явно указать, к какому именно виду документа объекта задач вы обращаетесь. В этом случае система не будет затрагивать в запросе остальные таблицы документов, которые может содержать ОбъектЗадачи.
Идеальное решение - вынести нужный признак в реквизиты самой задачи (менять его при изменении состояния объекта задачи). Тогда этот запрос не будет делать никаких соединений и будет работать только таблицей задач. Вам предложили промежуточный вариант оптимизации, если ваш запрос актуален только для некоторых типов объектов задач из всех возможных. Тогда с помощью ВЫРАЗИТЬ можно явно указать, к какому именно виду документа объекта задач вы обращаетесь. В этом случае система не будет затрагивать в запросе остальные таблицы документов, которые может содержать ОбъектЗадачи.
1. Переписать запрос для избавление от "ИЛИ" в условии - сделать объединение двух однотипных подзапросов в одном из которых "И" на "Проведен", а в другом "И" на "ПометкаУдаления".
2. Добавить индекс по "Выполнена" (в палитре свойств - "Индексировать")
И первое и второе способно помочь сузить диапазоны внутренних блокировок SQL-сервера при выполнении запроса. Для начала попробуйте первое - оно в любом случае лишним не будет (и это довольно стандартный прием оптимизации критичных запросов, правда больше по производительности, чем по блокировкам). Индекс добавить всегда успеете (и еще не факт, что он окажется достаточно селективным и принесет реальную пользу).
2. Добавить индекс по "Выполнена" (в палитре свойств - "Индексировать")
И первое и второе способно помочь сузить диапазоны внутренних блокировок SQL-сервера при выполнении запроса. Для начала попробуйте первое - оно в любом случае лишним не будет (и это довольно стандартный прием оптимизации критичных запросов, правда больше по производительности, чем по блокировкам). Индекс добавить всегда успеете (и еще не факт, что он окажется достаточно селективным и принесет реальную пользу).
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)