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