Имя: Пароль:
1C
1С v8
Блокировки в 1С
,
0 Septera
 
03.04.20
11:15
Управляемые блокировки, надо заблокировать регистр накопления для чтения, в ОбработкаПроведения документа пишу:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ТоварыНаСкладах";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();

Перем123 = 123; // точка остановки

Останавливаюсь в конфигураторе, открываю в новом окне 1С, выполняю запрос на выборку из регистра и о чудо он выбирает?! Что блин происходит кто-нибудь может мне объяснить?
1 polosov
 
03.04.20
11:27
(0) Попробуй

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
2 Septera
 
03.04.20
11:33
(1) тоже самое
3 ptiz
 
03.04.20
11:40
(0) "выполняю запрос на выборку из регистра " - в транзакции?
4 Septera
 
03.04.20
11:41
(3) нет, просто запрос Оо, а что в транзакции надо чтобы увидеть блокировку?
5 ptiz
 
03.04.20
11:45
(4) ага
6 fisher
 
03.04.20
11:49
(0) Ты управляемые блокировки с автоматическими не попутал? Управляемые блокировки только сами себя блокируют. Запросам на них плевать.
7 fisher
 
03.04.20
11:58
На пальцах - автоматические блокировки полностью опирались на блокировки СУБД. Но в отсутствие гибкого управления со стороны прога приходилось стрелять из пушки по воробьям (использовать максимальный уровень изоляции транзакций с плачевным результатом для параллельности).
Поэтому решили так - уровень изоляции транзакций СУБД опустить до минимально разумного, а дальше пускай прог рулит управляемыми блокировками. СУБД вообще ни сном ни духом про управляемые блокировки. Их сервер приложений контролирует.
8 Septera
 
03.04.20
12:00
(5) спасибо комрад!
(6) я попутал когда решил что блокировки в 1С работают по такому же принципу как в MySQL, когда там ставишь блокировку уровня SERIALIZABLE то разницы нету в транзакции или нет делает кто-то запрос, блокировка стоит и все тут
9 Septera
 
03.04.20
12:03
(7) "СУБД вообще ни сном ни духом про управляемые блокировки. Их сервер приложений контролирует." - вот это $#ять больше всего парит в 1С, кто сказал что так лучше, хз... сами так придумали и решили пусть будет так, а весь остальной мир живет по своим правилам
10 mistеr
 
03.04.20
12:04
(0) В сеансе чтения тоже нужно заблокировать.
11 mistеr
 
03.04.20
12:05
(9) Книжки читай, тогда будешь знать, кто придумал и зачем.
12 fisher
 
03.04.20
12:07
(9) Ты не шаришь. В автоматических блокировках как раз и жили в SERIALIZABLE и жили очень хреново. И 1С тут не изобретатели. Я уже встречал подобные решения. И это отличный компромисс, я тебе скажу.
13 Cyberhawk
 
03.04.20
12:10
(4) В 8.3 запретить другим читать вне транзакции никак не можешь
14 Septera
 
03.04.20
12:11
(9) по каждому языку свою книжку про особенности работы с базой или может не$%й изобретать свои идиотские принципы программирования? почему мне не приходится программирую на php переучиваться работе с транзакциями в java или python?
15 Septera
 
03.04.20
12:18
(12) да причем здесь автоматические или управляемые, просто привел пример в виде SERIALIZABLE для моей задачи он сейчас требуется и никто не говорит что всегда нужен, я его вообще редко использовал в СУБД потому что с блокировками надо аккуратнее, все просто может повиснуть, кроме SERIALIZABLE есть еще READ UNCOMMITTED, READ COMMTITED, REPEATABLE READ и все это вместе дает необходимый ресурс для разработчика чтобы решить проблемы с параллельным чтением/записью, просто кто-то решил что надо сделать все "по-своему"
16 Cyberhawk
 
03.04.20
12:24
(14) "кроме SERIALIZABLE есть еще READ UNCOMMITTED, READ COMMTITED, REPEATABLE READ и все это вместе дает необходимый ресурс для разработчика чтобы решить проблемы с параллельным чтением/записью" // Не дает
17 timeforlive
 
03.04.20
12:27
КОД:
// Создание объекта блокировка
Блокировка = Новый БлокировкаДанных;
// Добавление элемента блокировки
Элемент = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
// Установка режима блокировки
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
// Установка полей блокировки
Элемент.УстановитьЗначение("Склад", Склад);
Элемент.ИсточникДанных = СписокНоменклатуры;
Элемент.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
//Блокировка данных
Блокировка.Заблокировать();

Источник: курсы-по-1с
Из темы 11: Какие навыки в использовании управляемых блокировок потребуются на экзамене
18 mistеr
 
03.04.20
12:28
(14) Потому что ты еще не сталкивался по-настоящему с проблемами конкурентного доступа к БД.

И оставь свое раздражение при себе, тут не курилка, чтобы выговориться.
19 mistеr
 
03.04.20
12:30
(15) Поставь автоматические блокировки, сделать "ВЫБРАТЬ ... ДЛЯ ИЗМЕНЕНИЯ" и будет тебе (почти) serializable.
20 fisher
 
03.04.20
12:31
(14) Ты ж не путай божий дар с яичницей. В других языках ты можешь контролировать все тонкости взаимодействия твоей программы с СУБД. И ты БЛЯДЬ БУДЕШЬ контролировать все тонкости. Каждый запрос ты должен понимать когда посылать и как посылать. Иначе твоя программа будет обычным говнокодом, неспособным к высокопроизводительной параллельной работе без потери целостности состояний. А 1С пытается максимально снять этот гемор с програ, чтобы каждая домохозяйка смогла писать рабочий код, не углубляясь в дебри. Не забывай, что кучу запросов 1С генерит неявно. 1С пытается максимально все упростить без большой потери гибкости. И я считаю, что у них отлично получилось. Ты просто не распробовал вкус устриц а уже брызжешь слюной потому что где-то не так как ты привык.
21 Septera
 
03.04.20
12:40
(20) вооо, зришь в корень, значит надо нанять стадо домохозяек и научить их кодить, платить зп продуктами, а самому жить на Бали)
22 fisher
 
03.04.20
12:54
(21) А ты думал, куда попал? Одинэсники эти самые домохозяины и есть :) Только жаднее, чем ты думаешь :)
23 dmpl
 
03.04.20
13:38
(21) Управляемые блокировки - это еще бОльшая гибкость. Хочешь - изолируешь. Не хочешь - не изолируешь. Запусти оба своих запроса на чтение в транзакции. После блокировки данных одним из запросов - фиг ты прочитаешь, пока не снимешь блокировку. Но если все-таки надо прочитать - запускаешь запрос вне транзакции и читаешь.