CRM. Конфликт блокировок при выполнении транзакции

Внимание! Данный форум является модерируемым.
Для получения к нему доступа необходимо зарегистрироваться или авторизоваться на сайте.

Страницы: Пред. 1 2
RSS
CRM. Конфликт блокировок при выполнении транзакции
 
Обработку проведения документа "Событие" мы не трогали.

Вероятно, проблема у нас была связана со следующим:
Для хранения значений некоторых групп событий были созданы константы.
На форму документа "Событие" было выведено поле, при выборе значения которого происходило создание нового "События". Группа создаваемого события зависела от группы исходного События (группа исходного события сравнивалась со значением константы). Все это происходило в транзакции. Код целиком не привожу, примерно так (чтобы смысл был понятен):
СоздаватьСобытие = Ложь;

Если тРезультатПереговоров = Перечисления.РезультатыПереговоров.ЗаключенКонтракт Тогда
СоздаватьСобытие = Истина;
ГруппаНовогоСобытия = Константы.ГруппаСобытийКонтракт.Получить();
ИначеЕсли тРезультатПереговоров = ... Тогда
...
КонецЕсли;

Если СоздаватьСобытие Тогда
НачатьТранзакцию();
Если Модифицированность Тогда
ТекстВопроса = "Для выполнения данной операции необходимо записать документ. Записать?";
Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Если Ответ <> КодВозвратаДиалога.Да Тогда
ОтменитьТранзакцию();
Возврат;
Иначе
Попытка
УспешноЗаписано = ЗаписатьВФорме();
Исключение
Сообщить(ОписаниеОшибки());
ОтменитьТранзакцию();
Возврат;
КонецПопытки;
КонецЕсли;
КонецЕсли;

Если Не УспешноЗаписано Тогда
ОтменитьТранзакцию();
Возврат;
КонецЕсли;

НовоеСобытие = Документы.Событие.СоздатьДокумент();
НовоеСобытие.Заполнить(Ссылка);
НовоеСобытие.ГруппаСобытия = ГруппаНовогоСобытия;

Форма = НовоеСобытие.ПолучитьФорму("CRM_ФормаДокумента");
Результат = Форма.ОткрытьМодально();


Если НЕ НовоеСобытие.Проведен Тогда
ОтменитьТранзакцию();
Иначе
РезультатПереговоров = тРезультатПереговоров;
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецЕсли;


Сейчас транзакции при выполнении данной операции убрала и пока (с субботы) подобных ошибок больше не было.
 
Не правильно код привела, транзакция раньше начиналась:

НачатьТранзакцию();
СоздаватьСобытие = Ложь;

Если тРезультатПереговоров = Перечисления.РезультатыПереговоров.ЗаключенКонтракт Тогда
СоздаватьСобытие = Истина;
ГруппаНовогоСобытия = Константы.ГруппаСобытийКонтракт.Получить();
ИначеЕсли тРезультатПереговоров = ... Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;

Если СоздаватьСобытие Тогда
Если Модифицированность Тогда
ТекстВопроса = "Для выполнения данной операции необходимо записать документ. Записать?";
Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Если Ответ <> КодВозвратаДиалога.Да Тогда
ОтменитьТранзакцию();
Возврат;
Иначе
Попытка
УспешноЗаписано = ЗаписатьВФорме();
Исключение
Сообщить(ОписаниеОшибки());
ОтменитьТранзакцию();
Возврат;
КонецПопытки;
КонецЕсли;
КонецЕсли;

Если Не УспешноЗаписано Тогда
ОтменитьТранзакцию();
Возврат;
КонецЕсли;

НовоеСобытие = Документы.Событие.СоздатьДокумент();
НовоеСобытие.Заполнить(Ссылка);
НовоеСобытие.ГруппаСобытия = ГруппаНовогоСобытия;

Форма = НовоеСобытие.ПолучитьФорму("CRM_ФормаДокумента");
Результат = Форма.ОткрытьМодально();


Если НЕ НовоеСобытие.Проведен Тогда
ОтменитьТранзакцию();
Иначе
РезультатПереговоров = тРезультатПереговоров;
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецЕсли;
 
Да, вероятнее всего у вас накладываются блокировки, которые "отпускаются" только после фиксации транзакции.
Надеюсь, эти константы не изменяются в процессе создания событий и т.п.?
таблица констант всегда блокируется полностью и константы нельзя перезаписывать при проведении и других операциях, в которых могут возникать конкурентные блокировки.
Лучше для этого использовать регистр сведений или хотя бы справочник  с предопределенными элементами.
 
ООО - у вас же написано
Результат = Форма.ОткрытьМодально();

То есть вы просто берете и блокируете работу до тех пор, пока форму не закроют и выполнение не пойдет далее, чтобы зафиксировать транзакцию!
 
Алексей, в данной ситуации константы читались, запись не производилась. По идее, блокировки не должно было быть
 
Но это не важно -  блокировки, возникающие при записи событий  то некуда не денутся.
Цитата
Блокировкой называется временное ограничение на выполнение некоторых операций обработки данных. Блокировка может быть наложена как на отдельную строку таблицы, так и на всю базу данных. Управлением блокировками на сервере занимается менеджер блокировок, контролирующий их применение и разрешение конфликтов. Транзакции и блокировки тесно связаны друг с другом. Транзакции накладывают блокировки на данные, чтобы обеспечить выполнение требований ACID. Без использования блокировок несколько транзакций могли бы изменять одни и те же данные.
 
Алексей, спасибо большое за разъяснение!!! В нашей ситуации транзакция был-то по сути и не нужна, сейчас уже сложно сказать, зачем так было сделано
Страницы: Пред. 1 2
Читают тему
Поддержка отраслевых решений «1С-Рарус»
Услуги 1С