AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.03.2009, 11:10   #1  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Как принудительно создать блокировку?
Пытаюсь на только что созданной таблице создать блокировку
Но что-то не получается.
Создал джобик на update.
Захожу в два сеанса. В первом ставлю точку останову на update.
Во втором удаляю эту запись.
В результате система сначало ждёт пока я проапдейчу, а только потом удаляет.
Блокировки не возникает.
Может у кого есть какие идеи, как принудительно создать блокировку.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 19.03.2009, 11:22   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
1. Откройте транзакцию
2. select forupdate forselocked <- в 4ке новый идентификатор, не помню на память точно, как-то так.
3. Закройте транзакцию

С Уважением,
Георгий
За это сообщение автора поблагодарили: plumbum (1).
Старый 19.03.2009, 11:25   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Сорри. Забыл написать.
Ax 3.0 sp4.
Oracle 10g.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 19.03.2009, 11:39   #4  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от miklenew
...
В результате система сначало ждёт пока я проапдейчу, а только потом удаляет.
Блокировки не возникает.
...
Сами себе противоречите. Это и есть блокировка.

Что вы понимаете под блокировкой? Deadlock? Deadlock — это частный случай при работе с блокировками. Обычно блокировки приводят к ожиданиям, как вы написали выше. Deadlock — это конфликт, т.е. когда ожидание ни к чему не приведет. Блокировки возникают даже если к базе подключена только одна сессия.
__________________
С уважением,
glibs®
Старый 19.03.2009, 11:44   #5  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от glibs Посмотреть сообщение
Обычно блокировки приводят к ожиданиям, как вы написали выше. Deadlock — это конфликт, т.е. когда ожидание ни к чему не приведет.
Так вот она ждёт и сообщение о блокировке не появляется.
Может я мало ждал?
Щас попробую подольше подождать.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 19.03.2009, 11:59   #6  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Хм. Ну, в общем, это и есть блокировка... Т.е. Вы хотите отследить ситуацию, при которой система скажет "погоди! сейчас над этой записью идет работа другого сеанса?".

А вот тут вопрос. Ничего необычного-то для ситемы не возникает в данный момент + возможно зависит от настроек.

Попробуй
X++:
    try
     {
         ttsBegin;
         select...
         ttsCommit;
     }
     catch
     {
       info (appl.ttslevel()); //Это просто для примера. Возможно, еще что-то в sysException лежит
       ttsAbort;
     }
С Уважением,
Георгий
Старый 19.03.2009, 12:23   #7  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от miklenew
Так вот она ждёт и сообщение о блокировке не появляется.
Может я мало ждал?
Щас попробую подольше подождать.
Ждать не стоит. Аксапта отслеживает только deadlock-и. В состоянии обычной блокировки она может висеть сколь угодно долго. Ничего при этом она не говорит. И не скажет.
__________________
С уважением,
glibs®
Старый 19.03.2009, 12:36   #8  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от George Nordic Посмотреть сообщение
Хм. Ну, в общем, это и есть блокировка... Т.е. Вы хотите отследить ситуацию, при которой система скажет "погоди! сейчас над этой записью идет работа другого сеанса?".
Aга, хочу вот это
Цитата:
Тупиковая ситуация. Один или несколько пользователей одновременно блокировали всю таблицу или ее часть.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 19.03.2009, 12:39   #9  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от glibs Посмотреть сообщение
Ждать не стоит. Аксапта отслеживает только deadlock-и. В состоянии обычной блокировки она может висеть сколь угодно долго. Ничего при этом она не говорит. И не скажет.
Да. Сходил поел. Система ждала пока я пообедаю.
Пришёл снял с остановки.
И нормально система проапдейтила и удалила запись.
Т.е. от времени это не зависит.
Тогда вернёмся к первому сообщению "Может у кого есть какие идеи, как принудительно создать блокировку".
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 19.03.2009, 13:02   #10  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Может стоит пойти от обратного... Не допускать таких ситуаций. Как в журналах например.
Старый 19.03.2009, 13:09   #11  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Может стоит пойти от обратного... Не допускать таких ситуаций. Как в журналах например.
Вопрос не в этом?
Просто мне казалось, что если нужно, то так можно создать тупиковую ситуацию.
Ошибался.
Считайте, что здесь сугубо теоретический интерес.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 19.03.2009, 13:09   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от miklenew Посмотреть сообщение
Тогда вернёмся к первому сообщению "Может у кого есть какие идеи, как принудительно создать блокировку".
Если вы про deadlock - то легко.
Создаем в таблице две записи.
2 джоба.

1-й джоб:
1. ttsBegin;
2. Блокировка 1-й записи forupdate
3. breakpoint
4. Блокировка 2-й записи forupdate

2-й джоб:
1. ttsBegin;
2. Блокировка 2-й записи forupdate
3. breakpoint
4. Блокировка 1-й записи forupdate

Запускаем с одной сессии первый джоб, со второй сессии - второй.

Она оба остановятся на п.3
после этого давим F5 в обоих отладчиках и получаем deadlock

Правда исключение в аксапте может возникнуть не сразу - зависит от настроек БД
За это сообщение автора поблагодарили: miklenew (5).
Старый 19.03.2009, 13:39   #13  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Спасибо.
То что нужно.
Вот джобы. Может кому пригодяться.
X++:
static void Job1(Args _args)
{
    Table2 table;
;
    ttsbegin;
    select forupdate table
        where table.Field1 == '1';

    breakPoint;
    table.update();

    select forupdate table
        where table.Field1 == '2';

    ttscommit;
}
X++:
static void Job2(Args _args)
{
    Table2 table;
;
    ttsbegin;
    select forupdate table 
        where table.Field1 == '2';

    breakPoint;
    table.update();

    select forupdate table
        where table.Field1 == '1';

    ttscommit;
}
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.

Последний раз редактировалось miklenew; 19.03.2009 в 13:48.
Теги
блокировка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно создать в коде X++ новый planned order (ReqPO, ReqTrans) rkorchagin DAX: Программирование 5 02.06.2016 18:00
Как в аксапте создать разделяемую блокировку на запись в SALESTABLE. sergeypp DAX: Программирование 2 01.09.2006 15:09
Очень просто: создать новую запись в таблице Hobo DAX: Программирование 20 11.07.2006 13:02
Невозможно создать таблицу chel DAX: Программирование 0 21.04.2004 21:02
HELP!!! Как создать неуникальнцю метку в Axapta 3.0??? Maxim Gorbunov DAX: Программирование 3 14.04.2003 12:29
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:09.