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