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

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

Тут точно ошибки нет?
4 pechkin
 
16.11.21
10:19
(3) ячейка - составной тип: ячейка+контейнер
5 pechkin
 
16.11.21
10:21
(2) выбирай любой
https://infostart.ru/public/706204/
я юзаю через winmgmts
6 unbred
 
16.11.21
10:24
(5) у меня пустой цикл. мне не нра. твой вариант сильно лучше?
7 unbred
 
16.11.21
10:30
(5) спасибо!!!
8 Ёпрст
 
16.11.21
10:42
(6) пустой цикл грузит проц не по -детски
9 unbred
 
16.11.21
10:43
(8) 50% разница. только что замерял.
10 Ryzeman
 
16.11.21
10:45
(2) БСП
ОбщегоНазначенияБТС.Пауза(<секунд>)
11 Ёпрст
 
16.11.21
10:47
Так, хотя бы
Процедура Уснуть(КоличествоСекунд)
    Попытка
        Соединение = Новый HTTPСоединение("127.0.0.0",,,,,КоличествоСекунд);
        Соединение.Получить(Новый HTTPЗапрос());
    Исключение
    Конецпопытки;    
КонецПроцедуры
12 ADirks
 
16.11.21
10:48
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый;
и
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

вот и конфликтуют
13 Ёпрст
 
16.11.21
10:49
(0) а режим управления блокировкой в свойствах конфы какой ?

ЗЫ: если явно указать в НачатьТранзакцию и там и там, что управляемый
14 unbred
 
16.11.21
10:49
(10) ты код покажи.
15 pechkin
 
16.11.21
10:49
(12) они по разным измерениям - это раз. по разным занчениям - это 2.
кмк блокировка по ячейке блокирует всю таблицу. но по тж я не проверял
16 Ryzeman
 
16.11.21
10:54
(14) Зачем? Это БСПшная процедура. Мне как бы не жалко, вот:

Процедура Пауза(Секунд) Экспорт
    
    ТекущийСеансИнформационнойБазы = ПолучитьТекущийСеансИнформационнойБазы();
    ФоновоеЗадание = ТекущийСеансИнформационнойБазы.ПолучитьФоновоеЗадание();
    
    Если ФоновоеЗадание = Неопределено Тогда
        Параметры = Новый Массив;
        Параметры.Добавить(Секунд);
        ФоновоеЗадание = ФоновыеЗадания.Выполнить("ОбщегоНазначенияБТС.Пауза", Параметры);
    КонецЕсли;
        
    ФоновоеЗадание.ОжидатьЗавершенияВыполнения(Секунд);
    
КонецПроцедуры
17 unbred
 
16.11.21
10:56
(11) лол. КоличествоСекунд 60.
код выполнялся 25 сек.
чот не оч.
18 Ёпрст
 
16.11.21
10:56
(12) разные же измерения и разные объекты , не ?
19 ADirks
 
16.11.21
10:56
(15) в доке пишут:
Разделяемая блокировка позволит конкурирующему процессу установить разделяемую блокировку по этому же условию, но не позволит установить исключительную блокировку.
20 unbred
 
16.11.21
10:59
(16) круто. и что мне этот код даёт?))
21 acht
 
16.11.21
10:59
(15) Ты накладывашь две блокировки по двум пространствам, которые пересекаются на каком-то значении:

Номер строки - Контейнер - Ячейка
1 - 1 - 1
2 - 1 - 2
3 - 2 - 1
4 - 2 - 2

Первая блокировка по Контейнер = 1 захватывает строки 1 и 2
Второя блокировка по Ячейка = 2 захватывает строки 2 и 4

Конфликт на строке 2, так как вторая блокировка исключительная.
22 pechkin
 
16.11.21
11:00
(19) думаешь если на исключительну поменять - заработает?
23 pechkin
 
16.11.21
11:01
(21) никаких значений в регистре нет или даже есть - разницы нет
24 pechkin
 
16.11.21
11:06
Слабал демо пример.
На файловой точно отрабатывает
https://cloud.mail.ru/public/WKym/GVzg9RJ2R
25 H A D G E H O G s
 
16.11.21
11:19
(0) с фантомами так борются, Анатолий.
26 Ёпрст
 
16.11.21
11:20
Ну, в доке написано, что есть режим поглощения блокировок

см п.9.3.6
https://its.1c.ru/db/v8314doc#bookmark:dev:TI000000537
27 unbred
 
16.11.21
11:25
(10) ага, почитал, спасибо. чот так себе. что там в платформе зашито, тоже не ясно..
28 ДенисЧ
 
16.11.21
11:29
(24) На файловой управляемые блокировки? Это когда такое сделали?
29 unbred
 
16.11.21
11:30
(11) до 20 сек работает корректно. видимо, что-то в настройках сервака..
30 Cyberhawk
 
16.11.21
11:31
Потому что не указываешь второе измерение
31 hhhh
 
16.11.21
11:32
(24) на файловой захватывается вся таблица, без вариантов.
32 Ёпрст
 
16.11.21
11:32
(29) есть настройка таймаута, по-умолчанию 30 сек, у тя просто не дожидается и вылет
33 Добрыня Никитич
 
16.11.21
11:39
(0) Блокировка по значению одного измерения значит, что что по второму измерению блокируются все значения. Поэтому такая блокировка конфликтует с блокировкой по конкретным значениям второго измерения.
34 polosov
 
16.11.21
11:41
(0) Просто сделай запросом выборку по первому отбору и по второму, потом внутреннее соединение. И найдешь пересечение.
35 pechkin
 
16.11.21
12:15
(31) на управляемых блокировках - конечно же не так
36 pechkin
 
16.11.21
12:16
(30) где-то об этом сказано?
37 pechkin
 
16.11.21
12:19
(33) про ткое что-то не подумал. наверно так и есть
38 ДенисЧ
 
16.11.21
12:21
(35) На файловой?
39 acht
 
16.11.21
12:31
(35) На файловой базе блокировка на уровне СУБД по уровню перебивает все твои управляемые выкрутасы. Поэтому даже если управляемая блокировка пропустит тебя, ты гарантировано упрешся в блокировку СУБД. Потому как serializable.
40 pechkin
 
16.11.21
12:31
(38) на любой. управляемые блокировки живут не зависимо от СУБД
41 pechkin
 
16.11.21
12:31
(39) пример на файловой, а так то у меня скл
42 acht
 
16.11.21
12:32
(41) И зачем ты тогда вообще пример делал?
43 pechkin
 
16.11.21
12:33
(42) пример обычно делается для изоляции ошибки
44 acht
 
16.11.21
12:33
(43) Ну, ты мог бы еще на 7.7 его сделать.
45 ДенисЧ
 
16.11.21
12:34
(40) ОйблЪ...
46 pechkin
 
16.11.21
12:35
(45) собственно для этого и придумали упр блокировки. чтоб бд не мешала
47 polosov
 
16.11.21
12:37
(46) Нет. Управляемые блокировки придумали, чтобы разработчик более четко управлял блокировками.
48 polosov
 
16.11.21
12:38
+(47) Ну или сломал все к херам.
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) Подустал ты. Иди поешь, поспи. Хватит на сегодня.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.