Имя: Пароль:
1C
1С v8
v8: О принципах наложения управляемых блокировок.
0 camojiet
 
31.01.12
09:16
Здравствуйте! Я готовлюсь к сдаче Специалиста, и сейчас пробую решать задачи с использованием транзакционных блокировок.
Ни в коем случае не воспринимать как учебный материал, это моё видение принципов на начальном этапе освоения управляемых блокировок. Вероятнее всего оно ошибочное.
Я хотел бы прояснить принципы, которыми следует руководствоваться, при проектировке системы с самого начала используя управляемые блокировки.
А именно взаимоотношения между документами разных типов, отчетов использующих одни и те же регистры в разных режимах.

Я исхожу из проблем, которые призваны решать блокировки.
1. Потерянное обновление  
Может возникнуть при записи одного и того же объекта.
Решается установкой Исключительной блокировки на данный объект при записи.

2. Грязное чтение
Может возникнуть при чтении данных объекта, который в это время записывает другой процесс.
Решается установкой Разделяемой блокировки на считываемые данные.

3. Неповторяемое чтение.
Может произойти, если в одной транзакции данные с одних и тех же источников считываются не один раз, и между этими считываниями другая транзакция может изменить эти данные.
(Кто-нибудь считывает данные в одной транзации раза?)
Лечится наложением на читаемые данные Исключительной блокировки.

4. Фантомные вставки.
Ситуация может возникнуть при формировании отчета, использующего определенные записи (регистра накопления например),  в это время появляются новые записи, и отчету опять зачем-то считывает всю таблицу, и получает другой результат.
Лечится...хз... Получается разделяемой блокировкой на всю таблицу, чтобы док не смог наложить исключительную - но на какие записи? Записей то нет. (Впринципе всё равно так как два раза анализировать одну и ту же таблицу в одной транзакции вряд-ли придется)

Из этого я могу заключить - Накладывать разделяемые блокировки на все, что читаешь, а исключительные на всё что пишешь.

К примеру при проведении простого документа Приходная накладная, я делаю условие - где узнаю Перепроводится или проводится в перевый раз.
Если перепроводится накладываю транзакционные блокировки на существующие записи регистра по регистратору, потом их удаляю и записываю новые (движения) - так?
если проводится в первый раз то ничего не блокирую - так как нечего блокировать? (Это кстати и может привести в фантомным вставкам).

Или предыдущий абзац это задача объектных блокировок? Как разграничить проблемы которые решают объектные и транзакционные блокировки?
1 vmv
 
31.01.12
09:36
(0) предлагаешь тут писать диссер?

разруливай, описывай как и что делаешь - я буду следить за тобой
2 Рэйв
 
31.01.12
09:47
3 camojiet
 
31.01.12
10:23
Ооо! Это зачетное курево! Спасибо! Буду вникать.
4 Новиков
 
31.01.12
10:27
хорошие вопросы :)
5 Рэйв
 
31.01.12
10:41
6 2mugik
 
31.01.12
11:06
(0)А что на спеца теперь задачи идут на блокировки?
7 camojiet
 
01.02.12
03:00
Задания обязательно должны быть сделаны с использованием управляемых блокировок.
8 GROOVY
 
01.02.12
03:07
Управляемые блокировки решают последние 3 проблемы. Накладывать блокировки на объекты в рамках задач на спеца не нужно. Да и в реальной практике встречается крайне редко, сама система отлично справляется с этой задачей.
9 camojiet
 
01.02.12
09:39
to 8 почитайте свежие требования (2-я часть 3-ий абзац)
Хотя конечно заблокировав таблицу остатков при проведении расходной думаю устроит экзаменующих, но я буду использовать Postgres, и хотелось бы разобраться сразу, а не потом когда прижмет.
После курения манов от Рэйва.

Во-первых по проблемам(те что в сабже по номерам), 3-я проблема так и осталась за рамками понимания так-как это недоработка алгоритма считывать одно и тоже два раза в одной транзакции.
И ксатати для 3-го случая подойдет и Разделяемая блокировка.
Во-вторых 4-ый случай может быть хоть и редко, поэтому надо быть аккуратней при чтении итогов в одной таблице дважды в одной транзакции.    
Получается в 4-ом случае допустим отчет раделяемо блокирует всю таблицу регистра, а документ, который хочет записаться не может этого сделать так как Разделяемая блокировка и запись не совместимы. (Только вот интересно вывалится ошибка или будет ожидание в попытке произвести запись.)
В-третьих я так понял что объектный метод Записать накладывает Исключительную блокировку только в Автоматическом режиме.
В-четвертых, что объектные блокировки блокируют только интерактивно, и не гарантируют неприкосновенность данных вообще.
5. Просто шикарный материал, я думаю, что буду перечитывать его не один раз.

Получается что при построении ПриходнойНакладной где документ проводится в первые я просто заполняю движения, а там, где документ перепроводится
я в конце документа исключительно блокирую набор записей по этому регистратору и таблицу документов по ссылке на этот документ. (Разделяемая может обернуться взаимоблокировкой)
Так? Или можно ничего не накладывать? Что может произойти? - чисто теоретически? Какая-нибудь обработка программно изменит таблицу документа или набор записей? Это возможно?
Или какой-нибудь отчет будет считывать данные для анализа, а допустим мое проведение будет откатано назад и отчет будет оперировать измененными данными? (Хотя если отчет должен будет заблокировать таблицу разделяемо, то получит отказ и будет ожидать.)
10 Reaper_1c
 
01.02.12
10:01
Пипец. Грязное чтение и фантомные вставки не нужно побеждать. Это естественные процессы. Какая разница, будут ли отличаться результаты отчетов из-за того, что первый учел данные незавершенной транзакции, или второй увидел результаты транзакции не завершенной в момент формирования первого? С фантомными вставками таких расхождений будет меньше, потому как в нормальной системе откатов транзакций много меньше чем коммитов. Потерянные обновления платформа решит сама. Разработчику единственное, что нужно решать - обеспечить воспроизводимое чтение. И это не "читать два раза в одной транзакции". Это обусловленное проведение, когда формируемые движения зависят от информации в базе данных. Например расчет стоимости списания или расчет записей регистров расчета. И даже при обусловленном проведении нужно понимать, когда необходимо вмешиваться и дописывать блокировки к тем, что накладывает платформа, чтоб лишнего не наблокировать.
11 GROOVY
 
01.02.12
14:01
(9) Эти "свежие" требования от 2010 года. Блокировки на объект накладывать не надо, система сама прекрасно справляется с пессимистическими и оптимистическими блокировками объектов.
В рамках задач к сертификации управляемые блокировки нужно накладывать на регистры чтение из которых осуществляется при обусловленном проведении.