Имя: Пароль:
1C
 
Управляемые блокировки - боль. страдание. унижение.
0 H A D G E H O G s
 
12.01.15
14:50
День добрый.

Разбираюсь с управляемыми блокировками, все просто:

Движения.ТоварыНаСкладах.Очистить();
Движения.ТоварыНаСкладах.БлокироватьДляИзменения=БлокироватьДляИзменения;
Движения.ТоварыНаСкладах.Записывать = Истина;
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = Номенклатура;
Движение.Количество = Количество;

Меняю 2 параметра: БлокироватьДляИзменения и РазрешитьРазделениеИтогов
и смотрю в ТЖ.
Результаты:

1) БлокироватьДляИзменения=Истина, РазрешитьРазделениеИтогов=Истина:
Locks='AccumRg27.DIMS Exclusive Period=[T"20150101000000":+] Fld28="Яблоки"
2) БлокироватьДляИзменения=Ложь, РазрешитьРазделениеИтогов=Истина:
Locks='AccumRg27.DIMS Exclusive Period=[T"20150101000000":+] Splitter=6 Fld28="Яблоки"
3) БлокироватьДляИзменения=Истина, РазрешитьРазделениеИтогов=Ложь:
Locks='AccumRg27.DIMS Exclusive Period=[T"20150101000000":+] Fld28="Яблоки"
4) БлокироватьДляИзменения=Ложь, РазрешитьРазделениеИтогов=Ложь:
Locks='AccumRg27.DIMS Exclusive Period=[T"20150101000000":+] Fld28="Яблоки"

Теперь вопросы по результатам:
1) Блокировки по разделителю нет, ибо блокировка по измерениям - достаточна?
2) Блокировка по измерениям и по разделителю ставится, ибо режим регистра РазрешитьРазделениеИтогов приоритетен над свойством БлокироватьДляИзменения набора записей - так?
3) Все логично.
4) Почему вообще ставится блокировка????
11 WebberNSK
 
12.01.15
15:12
(9) потому что 1С так работает
12 Гёдза
 
12.01.15
15:12
БлокироватьДляИзменения - это не вкл/вкл блокировки.
Это вкл/выкл блокировки ЧТЕНИЯ
13 H A D G E H O G s
 
12.01.15
15:13
(10) БлокироватьДляИзменения=Ложь у набора РН выставил.

Или мне надо самому потом этот набор записать?
14 Гёдза
 
12.01.15
15:13
15 WebberNSK
 
12.01.15
15:14
(13)
БлокироватьДляИзменения ТОЛЬКО отключает разделитель итогов
16 H A D G E H O G s
 
12.01.15
15:15
(14) Спс, буду читать.
17 ma2
 
12.01.15
15:15
+(12)точнее, поставить эксклюзивные блокировки при считывании, во избежание их блокирования другими перед твоей записью. Так сказать уход от дедлока.
18 Гёдза
 
12.01.15
15:17
Просто 1с не корректно назвали свойство, уже не мало копий на этом сломано
19 WebberNSK
 
12.01.15
15:18
(18) все они нормально назвали, если "толстую" книжку с кубиком читать по порядку
20 Гёдза
 
12.01.15
15:26
(19) Нормально - это когда понимаешь смысл свойства без чтения толстой книги.
И не появляются потом статьи: А что же реально значит сее свойство
21 leonidkorolev
 
12.01.15
15:28
Просто не стали сильно расписывать. По идее получилось бы название

БлокироватьДляЧтенияВДругойТранзакцииДляКорректногоИзмененияВТекущейТранзакции.
22 Гёдза
 
12.01.15
15:29
Корректное название "БлокироватьЧтение"
23 H A D G E H O G s
 
12.01.15
15:29
По идее название должно было быть:

ОтключитьРазделениеИтогов
24 Гёдза
 
12.01.15
15:29
А назвали по аналогии с запросом "ДЛЯ ИЗМЕНЕНИЯ"
25 WebberNSK
 
12.01.15
15:32
(21) +100500
26 Господин ПЖ
 
12.01.15
15:38
(24) а где аналогия?

для изменения меняет вид блокировки на скуле S -> U

а тут меняется состав полей чтобы избежать дедлока
27 H A D G E H O G s
 
12.01.15
15:39
Теперь еще вопрос:

Вот есть у меня оприходование разными ПТУ одинакового товара.
Без использования "Разделение итогов" я не смогу одновременно проводить их?

Вроде раньше, когда этой опции ("Разделение итогов") не было - неявная блокировка по измерениям не ставилась, не?
28 Новенький_2009
 
12.01.15
15:41
(27) у одной из транзакций возникнут ожидания на блокировках таблицы итогов. Когда разделитель включен = две записи запишутся параллельно.

Ты ж вроде эксперта записывался сдавать? :)
29 H A D G E H O G s
 
12.01.15
15:43
(28) "у одной из транзакций возникнут ожидания на блокировках таблицы итогов. Когда разделитель включен = две записи запишутся параллельно. "

Я знаю, как будет сейчас.

Я спрашиваю - как было раньше, до появления режима "Разделение итогов"
30 Новенький_2009
 
12.01.15
15:44
(29) >>Без использования "Разделение итогов" я не смогу одновременно проводить их? - при отсутствии разделении итогов, "как раньше" - возникали ожидания. Параллельно две транзакции выполнится не могли.
31 Гёдза
 
12.01.15
15:45
(26) Аналогия в названии ))
32 Новенький_2009
 
12.01.15
15:45
два документа параллельно провестить, в описанном случае - не могли.
33 WebberNSK
 
12.01.15
15:49
(27) я думаю вам нужно освежить в памяти то, как работает механизм блокировок в 1С, тогда очень много вопросов отпадет
34 Новенький_2009
 
12.01.15
15:51
Я помню ТС записывался эксперта сдавать. Или путаюсь? Вроде что-то даже цифра то ли 3 фигурировала в датах :)
35 H A D G E H O G s
 
12.01.15
15:52
(33) Я и освежаю.
36 H A D G E H O G s
 
12.01.15
15:52
(34) Да, записывался на 19.01
37 Господин ПЖ
 
12.01.15
15:53
(31) предлагаю ввести еще свойство типа "НачатьИгнорироватьРазделитель" и пунктик в "совместимости"

больше батиков, малопонятных и разных
38 Господин ПЖ
 
12.01.15
15:54
(36) Дима, а курсы у тебя были по этой теме? или ты сам готовишься, факультативно?
39 Новенький_2009
 
12.01.15
15:54
(36) ну тогда как сдашь - не забудь похвастаться :)
40 Лохматые Уши
 
12.01.15
15:55
(7) В какой момент?
41 H A D G E H O G s
 
12.01.15
15:58
(38) 3 дня после завала по Эксперту :-) в УЦ1, теперь сам, факультативно.
42 WebberNSK
 
12.01.15
16:05
(36) удачи
успевайте сдавать до апреля, потом большая вероятность, что изменятся требования/задачи/вопросы и т.д.
43 H A D G E H O G s
 
12.01.15
16:06
http://infostart.ru/public/196565/ - отличная статья, все объясняющая в (0).
Только кодом вида:

    Движения.ТоварыНаСкладах.Очистить();
    Движения.ТоварыНаСкладах.БлокироватьДляИзменения=Ложь;
    Движения.ТоварыНаСкладах.Записывать = Истина;
    Движение = Движения.ТоварыНаСкладах.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение.Период = Дата;
    Движение.Номенклатура = Номенклатура;
    Движение.Количество = Количество;
    
    Движения.Записать();
    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки";
    ТЗ=Запрос.Выполнить().Выгрузить();
    Если Предупреждение Тогда
        Предупреждение("Блокировка");
    КонецЕсли;


Не удается вызвать взаимоблокировки.
44 kerm
 
12.01.15
16:08
А по курсу Оптимизация производительности «1С:Предприятие 8» и подготовка к 1С:Эксперт зря не стал готовится.
45 H A D G E H O G s
 
12.01.15
16:10
(44) Выучить то, что нужно сказать, чтобы получить зачет и при этом нихера не понять - это глупости.
46 Гёдза
 
12.01.15
16:10
(43) Так ведь радленение итогов же
47 H A D G E H O G s
 
12.01.15
16:11
(46) Так ведь чтение остатков же.
48 GROOVY
 
12.01.15
16:27
Тут ребята собрались перед экзаменом чайком побаловаться :)
http://forum.chistov.pro/index.php?topic=893.120
49 Serginio1
 
12.01.15
16:39
50 floody
 
12.01.15
16:39
(47) вопрос о "блокироватьдляизменения" еще актуален? устанавливается блокировка без учета разделителя, да. что еще?
51 H A D G E H O G s
 
12.01.15
16:50
(50) Нет, этот вопрос не актуален.
Актуален другой вопрос - когда я в одной транзакции заблокировал эксклюзивно строку итогов по товару, а в другой транзакции пытаюсь ее прочитать - и мне это удается. Почему?
52 floody
 
12.01.15
16:52
(51) может у вас 8.3 и mssql 2005 или выше?
53 H A D G E H O G s
 
12.01.15
17:01
(52) Да, так и есть.
54 kerm
 
12.01.15
17:02
(45) зря так пишешь. Очень четко все объясняет и показывает на тестовых примерах.
55 floody
 
12.01.15
17:03
snapshot же
56 floody
 
12.01.15
17:04
посмотрите ТЗ с остатками. там должно быть значение остатка без учета прихода первой транзакции.
57 Фауст
 
12.01.15
17:04
(43) Запусти обе транзакции и останови их после Движения.Записать(); и до запроса;

Первую отпусти выполнить запрос и останови после запроса;

Вторая не сможет выполнить запрос.

Должно быть так, Разделитель итогов не забыл включить ?
58 H A D G E H O G s
 
12.01.15
17:05
(57) Разделитель включен.
59 floody
 
12.01.15
17:05
cd'шку бы, тоже интересно стало посмотреть.
60 H A D G E H O G s
 
12.01.15
17:06
(55) snapshot - это уровень СУБД. Мы сейчас о блокировках 1С.
61 floody
 
12.01.15
17:09
(60) snapshot используется на субд, но только в случае управляемых блокировок. получается, сервер1с дает читать даже в случае эксклюзивной блокировки, т.к. прочитаете все равно негрязные данные.
62 H A D G E H O G s
 
12.01.15
17:10
(57) Вторая смогла выполнить запрос.
63 H A D G E H O G s
 
12.01.15
17:10
(61) Счаст посмотрю на ТЗ остатков.

Тоесть, сервер 1С забивает в данном случае на свои установленные блокировки?
64 floody
 
12.01.15
17:11
(62) попробуйте отключить в свойствах базы snapshot. и попробовать. для проверки.
65 floody
 
12.01.15
17:12
не то, чтобы забивает на свои блокировки, а всего лишь дает читать при установленной Х блокировке. наоборот не даст) ну вы проверьте, мне тоже интересно это.
66 Гёдза
 
12.01.15
17:13
Так ведь блокировать для изменения = ложь, почему должно чтение блокироваться ?
67 floody
 
12.01.15
17:14
(66) изначально X блокировка не совместима ни с чтением, ни с чем
68 H A D G E H O G s
 
12.01.15
17:16
(67) Речь про блокировки 1С ? Давайте, чтобы не путаться, X, S, U блокировки будем применять для сервера СУБД, а Эксклюзивная-Разделяемая - для сервера 1С.
69 floody
 
12.01.15
17:18
(68) под Х имел ввиду и субд, и упр. блокировки.. изначально любая блокировка (Х, эксклюзивная) на запись блокировала всё.

это было узким местом, соответственно, с появлением уровня snapshot решили это использовать и в 1С

проверили уже?
70 H A D G E H O G s
 
12.01.15
17:20
(68) Нет, момент
71 H A D G E H O G s
 
12.01.15
17:24
(69) Перевел.

Ага, 1С напоролась на блокировку СУБД

Конфликт блокировок при выполнении транзакции:
Microsoft SQL Server Native Client 10.0: Lock request time out period exceeded.
HRESULT=80040E31, SQLSrvr: SQLSTATE=HYT00, state=33, Severity=10, native=1222, line=1
72 H A D G E H O G s
 
12.01.15
17:24
При выполнении запроса по остаткам
73 H A D G E H O G s
 
12.01.15
17:25
Кровью и потом, а не читая статьи и махая гривой, что все понятно...
74 floody
 
12.01.15
17:26
я то думал мы дедлок пытаемся поймать
75 H A D G E H O G s
 
12.01.15
17:27
(74) Я тоже так думал, когда читал статью.
76 floody
 
12.01.15
17:28
по одной номенклатуре оба документа пишут движение?
77 H A D G E H O G s
 
12.01.15
17:29
Да
78 Масянька
 
12.01.15
17:30
Если я правильно понимаю смысл: при написании новой версии программы для бух. учета (утрировано) фирма 1С пытается создать СУБД.
Очень напоминает: в процессе написания прикладной программы создать операционную систему.
79 H A D G E H O G s
 
12.01.15
17:31
Хочется cf шник с примером deadlock-а
80 floody
 
12.01.15
17:35
(79) Можете дать свой cf? ну или dt?
81 Serginio1
 
12.01.15
17:35
82 floody
 
12.01.15
17:36
(81) спс, кэп )
83 H A D G E H O G s
 
12.01.15
17:43
84 ssh2QQ6
 
12.01.15
17:46
(71) напоролась потому что видимо была попытка прочитать незафиксированные в транзакции данные. А чтобы в другой трранзакции вообще не начиналось чтение данных на которые наложена упр блокировка, в ней также перед чтением нужно накладывать исключительную упр блокировку перед запросом, тогда будет уже ошибка 1с, а не субд. В автоматических блокировках вместо этого в запросе было "для изменения"
85 Гёдза
 
12.01.15
17:51
По 2м блокировкам нельзя поймать дэдлок.
86 Гёдза
 
12.01.15
17:52
нужно 4 минимум
87 H A D G E H O G s
 
12.01.15
17:53
(86) Статья - врет? :-)
89 floody
 
12.01.15
17:57
(85) всмысле по двум нельзя? две транзакции взаимоблокируются. какие еще нафиг четыре?
90 Гёдза
 
12.01.15
18:00
(87) ну там собственно и есть 4 блокировки: 2 на запись и 2 на чтение
91 Гёдза
 
12.01.15
18:00
(89) Транзакции 2 - блокировки 4
92 ssh2QQ6
 
12.01.15
18:03
(85) классическая ситуация:
считываются остатки потом запись
в автоматических блокировках, средством борьбы с дедлоком было "для изменения" в запросе. Ведь автоматических блокировках считанные запросом данные блокируются от изменения до конца транзакции. А с "для изменения" чтение в другой транзакции не произойдет до завершения первой и дедлока не будет.
В упр блокировках - данные читаемые запросом блокируются только на время чтения. Если не наложить никаких явных упр блокировок то дедлока не будет, но будет нарушение логики алгоритма, один сеанс может получить остатки которые к моменту записи уже будут изменены другой транзакцией. Если наложить разделяемую, то будет дедлок. Поэтому накладывается исключительная перед чтением.
93 floody
 
12.01.15
18:03
(87) соник, ищем дедлок, он должен быть, просто обязан.
94 Гёдза
 
12.01.15
18:03
Хотя то что запрос в транзакции вызывает наявную блокировку - странно как то
95 Reaper_1c
 
12.01.15
18:06
(0)
Объясняю на пальцах:
В Управляемом режиме работы с транзакционными блокировками:
1. Запись набора записей устанавливает неявную блокировку по всем измерениям.
2. Разделитель итогов по умолчанию включается в состав полей блокировки, накладываемой процессом записи по умолчанию
3. Для того, чтобы исключить разделитель итогов из полей блокировки предназначено свойство "блокировать для изменения" набора записей из коллекции движений документа.

Ссылок на документацию не найду, т.к. получал сокральные знания от Дмитрия Гончарова в УЦ 3. Все это элементы "новой" методики проведения, и на этом особенности методики еще не кончаются.
96 ssh2QQ6
 
12.01.15
18:07
(92) [В упр блокировках - данные читаемые запросом блокируются только на время чтения. ] - имеются ввиду блокировки субд, в упр блокировках уровень Read Committed.
97 H A D G E H O G s
 
12.01.15
18:18
(95) Это стало понятно несколько часов назад.
98 H A D G E H O G s
 
12.01.15
18:18
У народа каша в головах - сколько человек - столько и мнений.
99 H A D G E H O G s
 
12.01.15
18:19
Ладно, вернемся к блокировкам завтра.
100 Гёдза
 
12.01.15
18:20
Чтоб дедлок получить нужно Предупреждение перед запросом поставить
101 Гёдза
 
12.01.15
18:21
Запись1
Запись2
Чтение1
Чтение2
102 H A D G E H O G s
 
12.01.15
18:24
(100) Не работает
103 ssh2QQ6
 
12.01.15
18:24
дополнение к (92) - Вот здесь хорошо описано про взаимоблокировки. И для режима автоматических и управляемых
http://kb.1c.ru/articleView.jsp?id=46
104 floody
 
12.01.15
18:25
(100) Нет, не прав.

Объясняю, почему нет дедлока. Дедлок случается только в случае ПОВЫШЕНИЯ уровня блокировки в одной транзакции, т.е. сначала Чтение, потом запись. Но не наоборот, как в нашем случае. Чтением получаем данные только зафиксированных транзакций, т.е. первая наша транзакция не может помешать (она еще не зафиксирована).
105 floody
 
12.01.15
18:33
Хотя еще не совсем истина. Может груви заглянет.
106 Reaper_1c
 
12.01.15
19:47
(50) Платформа не блокирует чтение данных. Блокировки конкурируют с блокировками. Если тебе нужно обеспечить воспроизводимое чтение внутри транзакции - накладывай перед чтением разделяемую блокировку.
107 ИС-2
 
naïve
12.01.15
20:08
в файловой базе при записе блокируется вся таблица данных. Решение клиент-сервер. Но в порядке эксперемента удалите при блокировке файл 1Cv8.1CL из каталога БД
108 ИС-2
 
naïve
12.01.15
20:08
не туда
109 H A D G E H O G s
 
13.01.15
12:54
Все оказалось логично и понятно.
Перед чтением из регистра надо руками устанавливать разделяемую блокировку. При этом возникает deadlock, последовательность действий:
Запись1
Запись2
Чтение2
Чтение1
110 H A D G E H O G s
 
13.01.15
12:55
Забавно, что при неоперативном перепроведении документа - никакой блокировки по измерениям в регистре не ставится.
Тоже надо учитывать.