Вход | Регистрация
    1  2   
1С:Предприятие :: 1С:Предприятие 8 общая

Управляемые блокировки

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

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

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

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

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

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

Процедура Пауза(Секунд) Экспорт
    
    ТекущийСеансИнформационнойБазы = ПолучитьТекущийСеансИнформационнойБазы();
    ФоновоеЗадание = ТекущийСеансИнформационнойБазы.ПолучитьФоновоеЗадание();
    
    Если ФоновоеЗадание = Неопределено Тогда
        Параметры = Новый Массив;
        Параметры.Добавить(Секунд);
        ФоновоеЗадание = ФоновыеЗадания.Выполнить("ОбщегоНазначенияБТС.Пауза", Параметры);
    КонецЕсли;
        
    ФоновоеЗадание.ОжидатьЗавершенияВыполнения(Секунд);
    
КонецПроцедуры
   unbred
 
17 - 16.11.21 - 10:56
(11) лол. КоличествоСекунд 60.
код выполнялся 25 сек.
чот не оч.
   Ёпрст
 
18 - 16.11.21 - 10:56
(12) разные же измерения и разные объекты , не ?
   ADirks
 
19 - 16.11.21 - 10:56
(15) в доке пишут:
Разделяемая блокировка позволит конкурирующему процессу установить разделяемую блокировку по этому же условию, но не позволит установить исключительную блокировку.
   unbred
 
20 - 16.11.21 - 10:59
(16) круто. и что мне этот код даёт?))
   acht
 
21 - 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, так как вторая блокировка исключительная.
   pechkin
 
22 - 16.11.21 - 11:00
(19) думаешь если на исключительну поменять - заработает?
   pechkin
 
23 - 16.11.21 - 11:01
(21) никаких значений в регистре нет или даже есть - разницы нет
   pechkin
 
24 - 16.11.21 - 11:06
Слабал демо пример.
На файловой точно отрабатывает
https://cloud.mail.ru/public/WKym/GVzg9RJ2R
   H A D G E H O G s
 
25 - 16.11.21 - 11:19
(0) с фантомами так борются, Анатолий.
   Ёпрст
 
26 - 16.11.21 - 11:20
Ну, в доке написано, что есть режим поглощения блокировок

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

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

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

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

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

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

Говорит ли это о том, что в файловой нет менеджера блокировок? По-моему, нет.
   mistеr
 
98 - 16.11.21 - 15:37
(93) Где именно орет, ссылку и цитату можно? Только именно про управляемые, а не уровня СУБД, сам не перепутай.
   fisher
 
99 - 16.11.21 - 15:47
(97) Доказывает ли это, что в файловой есть менеджер управляемых блокировок? По-моему, нет.
   mistеr
 
100 - 16.11.21 - 15:48
(97) Кстати, по периоду та же петрушка.
  1  2   

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.