Имя: Пароль:
1C
1С v8
Управляемые блокировки
0 pechkin
 
16.11.21
10:15
Есть регистр накопления с 2мя измерениями
Контейнер, Ячейка (в таком порядке)
  
Берем пример. С какого х... эти блокировки конфликтуют?
  
&НаСервере
Процедура БлокироватьЯчейкуНаСервере()
    
    НачатьТранзакцию();
    
    Блокировка = Новый БлокировкаДанных;
    
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ПоложениеКонтейнеров");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый;
    ЭлементБлокировки.УстановитьЗначение("Ячейка", Контейнер2);
    Блокировка.Заблокировать();
    
    Пауза(60);
    
    ЗафиксироватьТранзакцию();
    
КонецПроцедуры

&НаСервере
Процедура БлокироватьКонтейнерНаСервере()
    
    НачатьТранзакцию();
    
    Блокировка = Новый БлокировкаДанных;
    
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ПоложениеКонтейнеров");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.УстановитьЗначение("Контейнер", Контейнер1);
    Блокировка.Заблокировать();
    
    ЗафиксироватьТранзакцию();
    
КонецПроцедуры
49 fisher
 
16.11.21
12:40
(40) Да. Но для файловой решили не заморачиваться. Ими же должен кто-то управлять. Поэтому на файловой блокировки всегда табличные.
50 Добрыня Никитич
 
16.11.21
12:41
(39) Валер, какой serializable? Как там в 2007, норм?
51 mistеr
 
16.11.21
12:44
(0) Какую ошибку получаешь?

И ТЖ покажи.
52 acht
 
16.11.21
12:46
(50) Кто такой Валера?
53 fisher
 
16.11.21
12:48
(49) + Скорее даже не из-за необходимости реализации менеджера блокировок на файловой, а из-за особенностей работы файлового движка, наверное. А может и то другое.
54 mistеr
 
16.11.21
12:50
(49) Не путай управляемые блокировки и табличные. На файловой работают и те, и другие.
55 fisher
 
16.11.21
12:52
56 fisher
 
16.11.21
12:53
Первая табличечка
57 pechkin
 
16.11.21
12:55
Признаю был не прав. все таки для блокировки записей нужен сервер
58 Fragster
 
гуру
16.11.21
12:56
(55) там неактуальная инфа, сейчас не read committed, а read committed snapshot
59 mistеr
 
16.11.21
12:57
(57) Но не для упр. блокировок.

(56) Эта табличечка про блокировочки СУБД.
60 mistеr
 
16.11.21
13:01
(24) А пожешь на 17 или 18 платформе сделать?
61 pechkin
 
16.11.21
13:01
(59) вот и я думал как ты. но все не совсем так
62 fisher
 
16.11.21
13:02
(58) Нельзя сказать, что неактуальная. Потому что read committed snapshot - это в терминологии mssql которым пришлось придумать новое название чтобы отличалось от старого блокировочного read committed. В общей литературе при упоминании режимов изоляции до таких ньюансов обычно не опускаются.
(59) Ок. И какой смысл тогда блокировать по измерениям регистра, если блокироваться будет вся таблица регистра хоть в лоб, хоть по лбу?
63 pechkin
 
16.11.21
13:04
64 mistеr
 
16.11.21
13:05
(62) При блокировке по измерениям регистра таблица не блокируется. Таблица блокируется при записи набора.

А смысл — упр. блокировки позволяют реализовать логику, которую не позволяют реализовать блокировки СУБД.
65 pechkin
 
16.11.21
13:06
при упр блокировках никакие таблицы не блокируются. блокируются виртуальные переменные про таблицы
66 pechkin
 
16.11.21
13:07
это можно легко увидеть, ибо при исключительной блокировке вполне можно запрос читать данные в другом сеансе.
67 fisher
 
16.11.21
13:13
(64) С одной стороны ты вроде прав. Но с другой - serializable обязывает к тому, чтобы прочитанные в одной транзакции данные нельзя было поменять в другой. И в файловой по-моему тупо реализовали так, что хрена ты проведешь параллельно два дока, пишущих в один регистр. Но я по файловой не спец, могу и ошибаться.
68 mistеr
 
16.11.21
13:18
(67) serializable обязывает немного к этому. :) Остальное верно, и даже без упр. блокировок. Но это не мешает использовать еще и их, когда нужно. :)
69 fisher
 
16.11.21
13:21
(68) В сабже нет записи в регистр. Но есть транзакция. И объявлена исключительная управляемая блокировка. Допускаю, что ее могут тупо транслировать в блокировку всей таблицы. Ибо нефиг. Или практика говорит об обратном?
70 mistеr
 
16.11.21
13:24
(63) Код в примере отличается от (0). Блокировка накладывается только по измерению Контейтер.
71 pechkin
 
16.11.21
13:24
(70) это я уже проверял что реально по таблице на файле
72 mistеr
 
16.11.21
14:08
(71) Да, что-то не очень понятное происходит.
Показывай записи о блокировках из ТЖ.
73 pechkin
 
16.11.21
14:09
(72) такой возможности снять тж нет. но вроде уже разобрались
74 Добрыня Никитич
 
16.11.21
14:10
(73) А почему нет? Одмины не дают доступ на сервер апликейшн?
75 mistеr
 
16.11.21
14:11
(73) И что выяснили?
76 Добрыня Никитич
 
16.11.21
14:15
(75) serializable же, привет из 2007
77 ДенисЧ
 
16.11.21
14:15
(71) внезапно, правда? )))
Везде декларируется, что на файловой базе блокировки идут по таблице, и тут оппа - и новость...
78 pechkin
 
16.11.21
14:25
(75) выяснили (33) спасибо Добрыня Никитич
79 fisher
 
16.11.21
14:43
(78) То есть блокировки по разным значениям одного измерения таки параллелит?
80 pechkin
 
16.11.21
14:45
(79) где на файле? на файле нет конечно. но мне то не для файла нужно
81 fisher
 
16.11.21
14:46
(80) Ну почему "конечно". mistеr говорит об обратном. А я не проверял, только догадками оперирую.
82 pechkin
 
16.11.21
14:48
(81) там же в табличке черным по желтому сказано: упр блокирвоки по таблицам
83 pechkin
 
16.11.21
14:49
собственно я тоже так думал, что упр блокировками удалось полностью абстрагироваться от БД. но таки не удалось
84 fisher
 
16.11.21
14:51
(82) mistеr намекал на то, что все так, но есть мол ньюанс.
85 fisher
 
16.11.21
14:55
Типа в табличке блокировки для СУБД, а в режиме управляемых блокировок для примера типа сабжевого должно обойтись без блокировок СУБД. Ну, я так его понял.
86 pechkin
 
16.11.21
14:56
(85) ну все правильно он говорит. Блокировок субд нет. есть упр. Это совсем другое
87 fisher
 
16.11.21
15:01
(86) Ты меня запутал. Хоть сам проверяй. Такой код у тебя параллелится или нет на файловой?

НаСервере
Процедура БлокироватьЯчейкуНаСервере()
    
    НачатьТранзакцию();
    
    Блокировка = Новый БлокировкаДанных;
    
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ПоложениеКонтейнеров");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый;
    ЭлементБлокировки.УстановитьЗначение("Контейнер", Контейнер1);
    Блокировка.Заблокировать();
    
    Пауза(60);
    
    ЗафиксироватьТранзакцию();
    
КонецПроцедуры

&НаСервере
Процедура БлокироватьКонтейнерНаСервере()
    
    НачатьТранзакцию();
    
    Блокировка = Новый БлокировкаДанных;
    
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ПоложениеКонтейнеров");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.УстановитьЗначение("Контейнер", Контейнер2);
    Блокировка.Заблокировать();
    
    ЗафиксироватьТранзакцию();
    
КонецПроцедуры
88 pechkin
 
16.11.21
15:03
(87) не параллелится
89 fisher
 
16.11.21
15:06
(88) Спасибо. Другими словами похоже на то, что в файловой работу с блокировками оставили как и было в режиме автоматических блокировок, только в добавок если налагаются управляемые, то еще и по ним таблицы блокируют.
90 pechkin
 
16.11.21
15:08
(89) именно так
91 ДенисЧ
 
16.11.21
15:09
(89) Скажите, как вам подойдёт лавровый венок изобретателя велосипеда?
92 fisher
 
16.11.21
15:13
(90) Ну, что-то такое я и предполагал. Это позволило обойтись вообще без какого-либо нового менеджера блокировок на файловой.
(91) Хуже, чем значок слоупока. Примерно так я и считал, но mistеr удалось зародить сомнение ибо на поведение файловой мне всегда было плевать и в детали я не вдавался.
93 ДенисЧ
 
16.11.21
15:14
(92) 1с во всех документациях просто орёт и бьётся об стенку, что в файловой управляемые не работают....
А вам пофиг....
94 pechkin
 
16.11.21
15:15
(93) почему не работают? работают но не совсем так
95 pechkin
 
16.11.21
15:16
в файловой любая упр блокировка тут же эскалируется на всю таблицу
96 fisher
 
16.11.21
15:17
(93) Как это не работают? Отлично работают. Все блокируется успешно. Документацию я и сам выше приводил. Но жизнь бывает богата на ньюансы.
97 mistеr
 
16.11.21
15:36
(89) (92) Я проверил. Действительно, блокировки, наложенные по разным значениям измерений, оказываются несовместимы. Но если накладывать разделяемые блокировки, то они совместимы.

Говорит ли это о том, что в файловой нет менеджера блокировок? По-моему, нет.
98 mistеr
 
16.11.21
15:37
(93) Где именно орет, ссылку и цитату можно? Только именно про управляемые, а не уровня СУБД, сам не перепутай.
99 fisher
 
16.11.21
15:47
(97) Доказывает ли это, что в файловой есть менеджер управляемых блокировок? По-моему, нет.
100 mistеr
 
16.11.21
15:48
(97) Кстати, по периоду та же петрушка.
101 pechkin
 
16.11.21
15:50
(100) так эскалация же на всю таблицу
102 Добрыня Никитич
 
16.11.21
15:50
Пипец вы развели бодягу...
103 fisher
 
16.11.21
15:50
(99) + Транслируют в те же разделяемые табличные блокировки и всего делов.
104 mistеr
 
16.11.21
15:51
(101) Я не очень понимаю, при чем тут таблица. Таблицы регистра никто не трогает.
105 pechkin
 
16.11.21
15:51
(104) если не нарвится слово таблица, то пусть будет: эскалация на все пространство блокировок
106 pechkin
 
16.11.21
15:52
(103) нет, никто ничего не транслирует. блокировки субд и упр никак не связаны даже на файле
107 mistеr
 
16.11.21
15:53
(105) Да, давайте придерживаться оф. терминологии, дабы не вводить в заблуждение и себя, и тех, кто будет читать это потом.
108 mistеr
 
16.11.21
15:56
Модифицированный пример, более удобный для проверки, если кому интересно: https://file.io/VgZtF6ClmvDi
109 fisher
 
16.11.21
15:56
(106) Гррр! На файловой должен же быть какой-то топорный механизм табличных блокировок реализованный еще для автоматических блокировок. И управляемые просто его же и задействуют. "Я так думаю" (с) Хачикян
110 mistеr
 
16.11.21
15:59
(109) Это возможно.
111 pechkin
 
16.11.21
16:00
(109) это можно проверить легко.
Сделать запись в справочник. 2 сеанс читает запросом. При блокировках СУБД  - 2й обломится. При упр должен смочь
112 fisher
 
16.11.21
16:09
(111) Не понял. Что будет доказано, когда обломится?
113 pechkin
 
16.11.21
16:11
(111) если ты после упр блокировки смог прочитать запросом - то это не имеет никакого отношения к табличным блокировкам субд.
но нужно еще и проверить что заявляемые табличные блокировки имеют к ним отношение
114 mistеr
 
16.11.21
16:13
(111) Чтение запросом не блокируется табличной блокировкой, только запись.
115 pechkin
 
16.11.21
16:16
(114) даже в транзакции?
116 pechkin
 
16.11.21
16:18
(115) таки проверил и оно бокируется
117 pechkin
 
16.11.21
16:18
и ошибка при выполнении запроса
Не удалось заблокировать таблицу '_Reference35'
118 mistеr
 
16.11.21
16:19
(115) Только что проверил. https://ufile.io/eqxvia47
119 pechkin
 
16.11.21
16:19
значит получается, что разные механизмы, хоть и работают похоже
120 pechkin
 
16.11.21
16:21
кстати без транзакции все читается хорошо. Все как и должно быть
121 fisher
 
16.11.21
16:21
(113) Я спрашивал, что будет доказано когда не сможет :)
122 pechkin
 
16.11.21
16:21
(121) значит 1 механизм
123 mistеr
 
16.11.21
16:21
(118) Прошу прощения, правильная ссылка https://ufile.io/i4p3u983
124 mistеr
 
16.11.21
16:22
(120) Транзакция есть всегда, может неявная
125 fisher
 
16.11.21
16:23
(122) Это не доказывает. А всего лишь не опровергает.
126 pechkin
 
16.11.21
16:23
проверил блокировку и запрос - все сработало, не заблокировалось.
Вывод - механизмы разные
127 fisher
 
16.11.21
16:24
(126) В параллельных транзакциях?
128 mistеr
 
16.11.21
16:24
(125) А в файловой вообще есть разделяемая блокировка таблиц? В каком случае используется?
129 pechkin
 
16.11.21
16:24
(127) конечно
130 pechkin
 
16.11.21
16:25
(128) получается что есть. При чтении таблицы в транзакции
131 mistеr
 
16.11.21
16:25
(130) Я имею в виду без относительно к упр.
132 pechkin
 
16.11.21
16:27
(131) про нее табличную и речь.
133 mistеr
 
16.11.21
16:28
(130) То есть во время чтения в таблицу нельзя писать?
134 fisher
 
16.11.21
16:29
(131) А как без нее обеспечивать serializable в автоматических блокировках?
135 pechkin
 
16.11.21
16:30
(133) нельзя. Иначе что это за блокировка такая
136 mistеr
 
16.11.21
16:35
(134) Ну да. :)

Надо проверить запрос итогов при наложенной упр. блокировке.
137 fisher
 
16.11.21
16:38
(126) Ну вот. Такую стройную теорию порушил.
138 fisher
 
16.11.21
16:40
(126) Но вообще как-то странно. Неконсистентненько.
139 fisher
 
16.11.21
16:40
(126) Ты точно исключительную блокировку ставил?
140 mistеr
 
16.11.21
16:41
(136) Проверил, не мешает.
141 fisher
 
16.11.21
16:46
Тогда получается что механизмы разные, но оба табличные. Как-то странно. Раз уж отдельно все-таки замутили, то нафига на таблицу эскалировать?
142 mistеr
 
16.11.21
16:56
(141) О какой таблице речь в случае упр. блокировки? :)
143 fisher
 
16.11.21
17:17
(142) О той, которая блокируется, когда управляемую блокировку просили не об этом.
144 pechkin
 
16.11.21
17:24
(143) никакая таблица не блокируется. Блокируется Пространство Блокировок. Просто некторая переменная
145 fisher
 
16.11.21
18:48
(144) О боже мой. А в настоящих СУБД значит другие блокировки, настоящие? Не служебные данные в служебных структурах, а прям таблица гвоздями заколачивается крест-накрест?
146 pechkin
 
16.11.21
18:54
(145) если ты не можешь прочитать данные - то блокируется, если не можешь - то не блокируется
147 ДенисЧ
 
16.11.21
18:55
(146) "если ты не можешь прочитать данные, то блокируется ... если не можешь- то не блокируется"
(с) Надо записать
148 polosov
 
16.11.21
18:56
(146) Подустал ты. Иди поешь, поспи. Хватит на сегодня.
Ошибка? Это не ошибка, это системная функция.