|
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 года. Блокировки на объект накладывать не надо, система сама прекрасно справляется с пессимистическими и оптимистическими блокировками объектов.
В рамках задач к сертификации управляемые блокировки нужно накладывать на регистры чтение из которых осуществляется при обусловленном проведении. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |