Имя: Пароль:
1C
1С v8
Возможен ли конфликт блокировок?
0 formista2000
 
23.09.22
16:46
Процедура ИзменитьНаименованиеНоменклатуры(Кнопка)
    НачатьТранзакцию();
    НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
    НоменклатураОбъект.Наименование = НоменклатураОбъект.Наименование + " (изменения)";
    НоменклатураОбъект.Записать();
    ЗафиксироватьТранзакцию();
КонецПроцедуры

Если да, то как его избежать?

ЗЫ: да, это вопрос с теста. А то я с управляемыми блокировками только с регистрами сталкивался.
1 Волшебник
 
модератор
23.09.22
16:50
Здесь не нужна транзакция
2 Галахад
 
гуру
23.09.22
16:51
Конечно возможен. Фиг его знает.
3 formista2000
 
23.09.22
16:53
(1) А как? Через попытка..исключение?
4 formista2000
 
23.09.22
16:53
(2) вот и я про то же, а если этот элемент справочника у кого-то открыт?
5 vde69
 
23.09.22
16:54
(3) для записи одного объекта транзакция не нужна в принципе.
транзакция нужна для того, что бы записать несколько объектов как одно целое (что бы нельзя было записать только часть данных)
6 rozer76
 
23.09.22
16:55
Нужна объектная блокировка через заблокироватьданныеобъекта. Управляемая не нужна. И транзакция тоже ечли один элемент меняешь - есть уже неявная
7 formista2000
 
23.09.22
16:57
(6) 8.3.18.1520 ЗаблокироватьДанныеОбъекта в синтаксисе помощнике не нашёл ((
8 H A D G E H O G s
 
23.09.22
17:02
(0)
Нет верного ответа
9 H A D G E H O G s
 
23.09.22
17:03
Хороший вопрос, кстате. Надо взять его на вооружение, НО. Никто на него и не ответит
10 rozer76
 
23.09.22
17:03
(7) ЗаблокироватьДанныеДляРедактирования
11 H A D G E H O G s
 
23.09.22
17:04
Тут будет 2 вариант,
1) Конфликт блокировок будет.
2) Конфликта не будет, будет несоответствие версию объектов.
Смотря в какой момент будет запись объекта в другой транзакции.
12 H A D G E H O G s
 
23.09.22
17:05
Если другая транзакция будет активна в момент выполнения кода - будет ожидание на блокировке и конфликт по истечению времени.
Если другая транзакция завершиться в момент, между кодом
НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
и
НоменклатураОбъект.Записать();

то будет несоответствия версий
13 rozer76
 
23.09.22
17:07
(7) или Объект.Заблокировать() в Попытке
14 rozer76
 
23.09.22
17:08
(12) ну тогда пускай оставляет транзакцию и делает упр.блокировку исключительную перед
НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
15 rozer76
 
23.09.22
17:12
(11) от п.п. 2 как раз защитит ЗаблокироватьДанныеДляРедактирования() если интерактивно уже кто-то начал менять объект.
16 rozer76
 
23.09.22
17:59
(0)
А вообще зависит ещк асколько ответственно нужно тебе менять данные - вот почитай когда нужна объектная а когда транзакционная а когда и та и другая вместе для ответственных изменений.
https://its.1c.ru/db/v8std/content/490/hdoc
https://its.1c.ru/db/v8std#content:648:hdoc
17 2mugik
 
24.09.22
13:45
Что-то вспомнилось:
Мальчик, а что у тебя на случай если ты второй билет потеряешь?
-А на этот случай у меня проездной.
18 2mugik
 
24.09.22
14:09
Кстати, в java есть понятие "мьютекс" по-моему нечто похожее на управляемую блокировку 1С.
19 H A D G E H O G s
 
24.09.22
15:29
(18) И в Windows тоже есть мьютексы для ограничения доступа к данным и критические секции для кода. И в SQL тоже есть. Везде есть.
20 ДедМорроз
 
24.09.22
18:08
Еонфликта блокировок тут быть не может.
Если объект уже заблокирован,то его чтение не пройдет,а если пройдет,то будет для объекта устанавливаться блокировка сразу для записи.

Напоминаю,что конфликт блокировок,это когда процесс 1 сначала блокирует А потом Б,а процесс 2 сначала Б потом А.

Если режим блокировок управляемый,то будет проблема эскалации,когда сначала будет поставлена блокировка на чтение,а потом на запись.
21 ДедМорроз
 
24.09.22
18:10
Крттическая секция в windows не на мутексе,а на семафоре,насколько я помню.