Имя: Пароль:
1C
 
Эмуляция взаимной блокировки
0 OldCondom
 
19.09.24
20:49
Не могу понять, как мне сделать взаимную блокировку для теста при записи в регистр сведений. Именно взаимную блокировку, а не таймаут.
Получился только 1 вариант : две записи по одному измерению. В первой транзакции блокирую первую запись, ставлю точку останова. Во второй транзакции под другим соединением блокирую вторую запись, а далее кодом хочу заблокировать первую, висит. В первой транзакции отпускаю точку останова, она кодом далее пытается блокировать вторую запись регистра, которая уже заблокирована второй транзакцией. Ловлю deadblock.

Все манипуляции по поводу разных уровней изоляции блокировок в моих кривых руках ни к чему не привели(в одной транзакции читаю(разделенная), потом хочу писать(исключительная), в другой транзакции - наоборот).

Очень сильно гуглил по мере сил примеры взаимных блокировок, ничего не нашёл, либо не понял.

Может кто нибудь накидать ещё примеров?
1 OldCondom
 
19.09.24
20:52
Я даже таймаутов блокировок не всегда могу добиться. Ставлю исключительную, оборачиваю в транзакцию, точку останова. В другом сеансе прекрасно прекрасно запросом читаю эти данные. Как мне заблокировать даже на чтение?
2 Волшебник
 
19.09.24
20:53
пишется "кто-нибудь"
3 H A D G E H O G s
 
19.09.24
20:56
Deadlock, что ты ловишь - это именно результат разруливания системой взаимоблокировки. Поздравляю, ты добился взаимоблокировки, но бесконечно висеть на ней тебе никто не даст.
Либо на уровне СУБД, либо на уровне 1С.
4 OldCondom
 
19.09.24
20:55
(2) если десятью пальцами, то да, с радостью, но на экранчике смартфона приходится полагаться на т9
5 OldCondom
 
19.09.24
20:57
(3) думаю скорее менеджер блокировок 1с, но суть вопроса это не меняет.
7 H A D G E H O G s
 
19.09.24
20:58
(1) 2 записи регистра по одному измерению при Чтении никак не пересекаются. Это при Записи 1С может наложить блокировку на Диапазон записей (рядом с записываемой записью) для предотвращения фантомов.
8 OldCondom
 
19.09.24
20:59
(7)но это будет именно таймаут:время ожидания блокировки истекло (в зависимости от настроек 1с,сколько там секунд выставлено)
9 H A D G E H O G s
 
19.09.24
21:01
Смотри техжурнал, там все увидишь, как там блокировки на уровне сервера 1С накладываются.
10 H A D G E H O G s
 
19.09.24
21:02
(8) да, именно таймаут. Повышения эскалации нет, разного порядка доступа нет. Откуда взаимоблокировка возьмется?
11 OldCondom
 
19.09.24
21:04
(10) Да, разумеется) В том то все и дело, нет пока тех журнала. Там магия произошла, как только я настроил на события dedlock и сбор транзакций sdb событий commit, rollback, end, ошибки, вжух, исчезли))
И сейчас хотелось бы понять, что за фигня творится? Для себя решил разобраться, а как вообще взаимные блокировки могут появиться в среде 1с?
12 OldCondom
 
19.09.24
21:04
*sdbl
13 H A D G E H O G s
 
19.09.24
21:05
Возхвалите 1С и SQL. В тру языках когда попадаешь на deadlock - потоки курят бамбуки и все останавливается без всяких надежд на воспроизведение и индикацию ошибки. Самая жопная жопа наравне с незаметным повреждением стека (это когда внезапно Access violation).
14 H A D G E H O G s
 
19.09.24
21:09
(11) поставь сначала разделяемую, потом исключительную блокировку на один и тот измерение в регистре и одной транзакции. Выполни код до 2ой блокировки в 2 сеансах (тормознись там по паузе или точке останова), потом отпусти код на выполнение.
15 OldCondom
 
19.09.24
21:09
(13) я это увидел по местным сборщикам через телеграмм ботов(обращаются напрямую к sql) - полезной инфы 0,я даже свою взаимную блокировку там найти не смог. Опять же, таймауты - пожалуйста, вот они, читайте.
16 OldCondom
 
19.09.24
21:10
(14)завтра попробую, спс
17 H A D G E H O G s
 
19.09.24
21:27
Все просто
18 OldCondom
 
19.09.24
21:31
(17)а второй сеанс?
19 H A D G E H O G s
 
19.09.24
21:33
<event>
      <eq property="Name" value="TDEADLOCK"/>
  </event>
20 H A D G E H O G s
 
19.09.24
21:33
(18) Второй сеанс отрабатывает нормально.
21 OldCondom
 
19.09.24
21:34
И в каком моменте точка останова у первого? Пробовал, но, опять же, по мере сил - не получилось. Также сперва разделяемая, потом исключительная, читает все вторая транзакция успешно
22 OldCondom
 
19.09.24
21:37
Кстати занятно, я думал жертва будет в waitconnection
23 H A D G E H O G s
 
19.09.24
21:38
(21) У обоих точка останова здесь

ОбъектРасширения.Спать(10000);

Оба сеанса должны выполнить код вот до этой строчки. Разделяемо заблокировать один общий ресурс. Имеют право.
Потом код продолжает работать в обоих сеансах.
Кто то первый дойдет на наложение исключительной блокировки и не сможет, так как ресурс разделяемо заблокирован другим сеасном.
Потом 2 сеанс подтянется и они оба начнут ждать друг друга.
Менеджер блокировок увидит хрень и откатит транзакцию одного какого то сеанса (жертва, cow)
24 OldCondom
 
19.09.24
21:38
А, ну да, потому что я дурак только и смог добиться таймаута)
25 OldCondom
 
19.09.24
21:40
(23).спасибо!
26 H A D G E H O G s
 
19.09.24
21:42
(25) не за что.
27 oleg_km
 
19.09.24
23:50
(14) Или тоже самое, но на двух документах (или справочниках). В одной процедуре сначала блокируешь объект №1, потом объект № 2, а во второй процедуре наоборот - сначала объект №2, потом объект №1. Запускаешь процедуру один и после блокировки объекта № 1 включаешь паузу. Потом запускаешь процедуру два. Как только процедура два встала на ожидании объекта №1, возобновляешь процедуру один
Основная теорема систематики: Новые системы плодят новые проблемы.