|
Эмуляция взаимной блокировки | ☑ | ||
---|---|---|---|---|
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, возобновляешь процедуру один
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |