Имя: Пароль:
1C
1С v8
блокировки при записи в регистр сведений
,
0 МОРЖ
 
03.04.13
15:08
При добавлении данных в регистр сведений какие блокировки накладываются на таблицу регистра? Есть ли зависимость типа блокировок от способа добавления записи(набор или менеджер записей)?
Могу ли я увеличить параллельность добавления записей в регистр сведений?
1 Xatori
 
03.04.13
15:15
http://forum.infostart.ru/forum26/topic81450/
вот почитай, очень интересно)
2 МОРЖ
 
03.04.13
15:58
(1) мда) увлекательно!) ответов не дало но порадовало!)
3 Serginio1
 
03.04.13
16:12
Если у тебя автоматические блокировки то значит у тебя уровень изоляции Repeatable read.
Если ты делаешь запись в транзакции то соответственно любые чтения у тебя блокируют и запрешают изменения.

Если у тебя управляемые блокировки то уровень изоляции понижается до уровень изоляции понижается до read committed
и нужно вручную накладывать блокировки. Смысл их один Писатель, много читателей. Перед записью накладывай исключительную блокировку, а  если хочешь, что бы данные не менялись в процессе транзакции накладывай Разделяемый
4 Serginio1
 
03.04.13
16:16
Смысл все делать в транзакции
5 Fragster
 
гуру
03.04.13
16:20
(3) в мсскуль блокировка может (и будет в большинстве случаев) накладываться на диапазон.
(0) у независимого РС есть т.н. основной отбор. если он на все измерения - то разницы между набором и записью - нет (набор = запись), если не на все, то следует понимать, что при записи одной строки будет записываться набор целиком по комбинации измерений основного отбора.
6 Fragster
 
гуру
03.04.13
16:21
(5).1 что дает возможность параллельной работы с разными кусками таблицы
7 МОРЖ
 
03.04.13
16:28
(3) Идею блокировок я понимаю. Пытаюсь понять как их отрабатывает платформа по умолчанию. Режим блокировок у РС управляемый, но в коде блокировки не прописаны. В этот РС параллельно пишутся данные. Пытаюсь понять, можно ли и нужно ли что-то сделать, чтобы параллельные добавления данные не мешали друг другу.
судя по всему на регистр накладываются разделяемые блокировки с отбором по записываемым измерениям, и по скольку наборы измерений различны процессы благополучно выполняются параллельно. Нет необходимости прописывать управляемую блокировку с отбором по измерениям?
8 Fragster
 
гуру
03.04.13
16:35
(7) пиши в несколько сеансов по разным комбинациям основных отборов
9 Fragster
 
гуру
03.04.13
16:36
управляемая блокировка нужна только если тебе важна неизменность результата - т.е. если ты опираешься на какие-то данные (разделяемая) или запрещаешь другим опираться на какие-либо данные (исключительная)
10 krbIso
 
03.04.13
16:36
(3) при модификации данных, в управляемом режиме блокировки накладываются автоматически менеджером блокировок 1С.
11 Fragster
 
гуру
03.04.13
16:39
например в http://fragster.ru/perfomanceTest/ одни и те же данные пишутся параллельно в несколько потоков и это позволяет записывать намного больше данных за 1 единицу времени (тут, конечно, зависит от оборудования).
12 Fragster
 
гуру
03.04.13
16:39
(11)+ одни и те же - по виду метаданных, ключевые измерения, естественно, раные
13 МОРЖ
 
03.04.13
16:41
(9) Спасибо!
Всем спасибо!
14 Serginio1
 
03.04.13
16:57
(10) Это понятно, просто перед записью обычно требуется сначала прочитать, а уж потом модифицировать.
15 Fragster
 
гуру
03.04.13
17:20
(14) "обычно" это как?
16 krbIso
 
03.04.13
17:36
(14) не обычно а (9)
17 Serginio1
 
03.04.13
18:04
(15) Обычно когда нужно сначала рассчитать считывая данные с разных регистров, а затем записать. Есть варианты когда можно записывать сразу без дополнительных расчетов.
Что касается 9 то это не совсем верно. Исключительная блокировка предотвращает не только чтение но и запись предотвращая дид луки. Если две транзакции сначала сделают разделяемую блокировку а затем начать писать, то ничего не выйдет, будут блокировать друг друга . Поэтому исключительная блокировка сначала ждет завершения всех транзакций, а затем уже делает с этими данными что хочет. Это аналог блокировок много читателей один писатель. Зная что ты будешь эти данные модифицировать и проводя предварительно расчеты.
18 Serginio1
 
03.04.13
18:28
Есть еще хинты позволяющие увеличить скорость параллельной работы updlock
http://www.sql.ru/forum/actualthread.aspx?tid=587955
19 Serginio1
 
03.04.13
18:37
http://www.sql.ru/forum/actualthread.aspx?tid=83697&pg=3&mid=668013#668013

. Блокировки типа Update нужны для обозначения такого факта: те, кто уже имеет Shared locks на этот же ресурс могут продолжать ими пользоваться, но любые новые блокировки запрещены. Как только shared locks уходят с ресурса блокировка типа U конвертируется в eXclusive, чтобы обозначить соответственно названию, что никакими другими сессиями этот ресурс не заблокирован вообще.

Короче, смысл блокировок U - не блокировать данные _читаемые_ при выборке под UPDATE, а обозначать факт того, что мы намереваемся менять данные сразу после того как уйдут те, кто их сейчас читает.

То есть ты можешь не дожидаться окончания  shared locks  как это было бы с eXclusive но до записи совместно читать данные.
20 Serginio1
 
03.04.13
18:45
http://www.rsdn.ru/?article/db/deadlocks.xml
Поскольку взаимоблокировка произошла из-за того, что транзакции удерживали коллективные блокировки и потом попытались их повысить до эксклюзивных, то, в принципе, помочь избежать неприятностей в данном случае сможет понижение уровня изоляции до READ COMMITED. При этом коллективная блокировка не будет держаться до конца транзакции, а снимется сразу после завершения чтения, а значит, обновить записи ничто не помешает. Но тогда вместо взаимоблокировки мы вполне можем получить неверные данные, так как между SELECT и UPDATE сможет втиснуться другая транзакция, которая изменит Y и данные, полученные SELECT’ на момент UPDATE, окажутся неактуальными, чего в некоторых случаях допускать нельзя.

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

В общем случае наилучшим выходом здесь будет наложение при чтении промежуточной блокировки обновления. Такая блокировка совместима с коллективной, что позволит читающим транзакциям обращаться к этим данным беспрепятственно. А когда понадобится их обновить, то проблем быть не должно, так как блокировки обновления между собой несовместимы, и значит, другие транзакции, читающие эти данные для последующего изменения (и естественно тоже запросившие их с блокировкой обновления), будут ждать, пока эти данные поменяются, никому не мешая. Для этого необходимо изменить первый оператор транзакции примерно таким образом:


SELECT @Var = Y FROM Tbl WITH (UPDLOCK) WHERE X = 2