1C 8 платформа. Блокировки данных
17.02.2010
22:46
#1
"Здравствуйте, друзья!<br>Вопрос о блокировках.<br>Правильно ли выбирать данные запросом (с параметром ДЛЯ ИЗМЕНЕНИЯ) для последующей их обработки. А затем записывать их назад в базу с помощью менеджера записи соответствующего регистра. Не происходит ли в этот момент запись данных которые я же и заблокировал запросом. Грамотно ли так выполнять чтение и последующую запись данных?<br>Если не удачно сформулировал вопрос приведу краткий пример:<br>Например, вот так читаю данные:<br> Запрос = Новый Запрос();<br> Запрос.Текст = "ВЫБРАТЬ<br> | РеквизитыБанкаСрезПоследних.Банк,<br> | РеквизитыБанкаСрезПоследних.БИК,<br> | РеквизитыБанкаСрезПоследних.Период,<br> | СправочникБанков.Наименование,<br> |ИЗ<br> | РегистрСведений.РеквизитыБанка.СрезПоследних(&Дата, ) КАК РеквизитыБанкаСрезПоследних<br> | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СправочникБанков КАК СправочникБанков<br> | ПО РеквизитыБанкаСрезПоследних.Банк = СправочникБанков.Ссылка<br> |ГДЕ<br> | СправочникБанков.Наименование = &Наименование"<br> | ДЛЯ ИЗМЕНЕНИЯ;<br> Запрос.УстановитьПараметр("Дата", Дата);<br> Запрос.УстановитьПараметр("Наименование", Банк.Наименование);<br> Выборка = Запрос.Выполнить().Выбрать();<br>.....<br>тут далее некая обработка данных<br>.....<br>и потом записываю их:<br> МенеджерЗаписи = РегистрыСведений.РеквизитыБанка.СоздатьМенеджерЗаписи();<br> МенеджерЗаписи.БИК = Выборка2.БИК;<br> МенеджерЗаписи.Период = Дата; <br> МенеджерЗаписи.Записать();<br><br>Кстати, какой сейчас по умолчанию в платформе используется тип блокировок (пессимистическая или оптимистичная)? В документации есть их описание, но в каких случаях какая применяется что-то не нашел.<br>"
18.02.2010
09:07
#2
Не надо путать объектные и транзакционные блокировки, пессимистическая и оптимистичная блокировки относятся к объектным и используются обе 1С. А то что вы имеете ввиду это транзакционные блокировки которые бывают автоматическими и управляемыми, по умолчанию автоматические. Подробнее о блокировках можно почитать в книге "1С предприятие от 8.0 к 8.1"
19.02.2010
09:27
#3
Прочел главу про блокировки. В первом приближении разобрался. Несколько вопросов на понимание, если позволите:<br><br>Верно понимать, что объектная пессимистическая блокировка (сопоставляемая с объектом концигугации, в данном примере с документом) в данном случае срабатывает при инициации формы документа. При создании объекта формы блокировка устанавливается, при закрытии - снимается. При этом само изменение данных возможно (поэтому в самом модуле формы в хэндлерах событий без ошибок данные читаются и записываются). Исключение возникает только при попытке установки блокировки на эти же данные другим или этим же объектом (т.е. если бы вызвал бы метод установки блокировки в явном виде Заблокировать() возник бы эксцепшн). При этом если бы я скажем из какой-либо другой формы конфигурации попытался бы прочитать данные без установки блокировки в последующем если считанные данные были изменены возникло бы исключение, т.к. сработала бы оптимистическая блокировка (проверка версий данных). Верно?<br><br>Транзакционная блокировка в автоматическом режиме устанавливается при начале обновления данных и снимается после завершения последней манипуляции с заблокированными данными. Т.е. При открытии скажем той же формы она не устанавливается, а вот при сохранении изменений она устанавливается на период записи данных и снимается после завершения записи. Верно?<br><br>И еще, для чего служит параметр "ДЛЯ ИЗМЕНЕНИЯ" в запросе? Вероятно,чтобы установить блокировку на прочитанные данные, но какую? и в какой момент она снимается? Если ставится блокировка на данные в запросе (в примере выше) почему без проблем записываются данные через менеджер записи регистра после выполнения данного запроса?<br><br>Заранее благодарен, что поможете разобраться!
06.04.2010
15:31
#4
Конструкция "ДЛЯ ИЗМЕНЕНИЯ" устанавливает исключительную транзакционную блокировку на прочитанные данные.<br>Обработка проведения выполняется в любом случае в ОДНОЙ транзакции, даже если вы ее не вызывали явно.<br>Исключительная блокировка устанавливается на записи в таблице (если есть СУБД, к примеру Microsoft SQL Server, но не PostgreSQL), либо на таблицы в целом (файловый вариант, PostgreSQL). Внутри этой транзакции вы можете читать эти данные, можете писать в эту таблицу. Из другой транзакции данные, на которые распространена конструкция "ДЛЯ ИЗМЕНЕНИЯ" не могут быть ни прочитаны, ни записаны. То есть запись менеджером производится в любом случае в той же транзакции, в которой вы читаете эти данные, поэтому и писать, и читать можете. Транзакционные блокировки не работают для, к примеру, отчетов, которые по умолчанию читают данные в режиме "грязного чтения".<br>Вообще, конструкция "ДЛЯ ИЗМЕНЕНИЯ" служит для того, чтобы избежать дедлоков при так называемом повышении уровня блокировок.
Читают тему
(гостей: 1)