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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.10.2009, 11:43   #1  
grif is offline
grif
Участник
Аватар для grif
 
236 / 10 (1) +
Регистрация: 31.08.2006
А подскажите пожалуйста как быть в такой ситуации.
Понять её можно на следующем примере.
Имеется таблица с первичным ключём по int полю Ind.
_OVTR - Record для этой таблицы
Код:
  FOR _i:= 1 TO 10000 DO
  BEGIN
    IF NOT _OVTR.GET(64) THEN
    BEGIN
      _OVTR.INIT;
      _OVTR.Ind := 64;
      _OVTR.INSERT;
    END;
    _OVTR.GET(64);
    _OVTR.DELETE;
  END;
Во время работы смотрим результат для sp_lock 64 (64 - моя сессия в которой выполянется описанный код):
64 11 0 0 DB S GRANT
64 11 795253988 1 KEY (4000de78af45) X GRANT
64 11 795253988 1 PAG 3:39153 IX GRANT
64 11 795253988 1 KEY (ffffffffffff) RangeS-U GRANT
64 11 795253988 0 TAB IX GRANT

Если создать в Navision новую сессию (66) и попытаться вставить в таблицу строку с Ind=65, то возникает блокировка.
sp_lock 64,66 показывает
66 11 0 0 DB S GRANT
64 11 0 0 DB S GRANT
64 11 795253988 1 KEY (4000de78af45) X GRANT
64 11 795253988 1 PAG 3:39153 IX GRANT
66 11 795253988 1 PAG 3:39153 IX GRANT
64 11 795253988 1 KEY (ffffffffffff) RangeS-U GRANT
66 11 795253988 1 KEY (ffffffffffff) RangeIn- WAIT
64 11 795253988 0 TAB IX GRANT
66 11 795253988 0 TAB IX GRANT

Т.е. возникла блокировка по диапазону индекса, как понимаю от 64 до бесконечности.

Если модифицировать код так
Код:
  FOR _i:= 1 TO 10000 DO
  BEGIN
    //IF NOT _OVTR.GET(64) THEN
    BEGIN
      _OVTR.INIT;
      _OVTR.Ind := 64;
      _OVTR.INSERT;
    END;
    _OVTR.GET(64);
    _OVTR.DELETE;
  END;
и снова запустить его в сессии 64, то sp_lock 64 покажет
64 11 0 0 DB S GRANT
64 11 795253988 1 KEY (4000de78af45) X GRANT
64 11 795253988 1 PAG 3:39153 IX GRANT
64 11 795253988 0 TAB IX GRANT

добавление записи с Ind=65 уже не вызывает блокирование т.к. отсутствует блокировка RangeS-U и судя по всему её вызывает GET. Подскажите пожалуйста, как это можно обойти?
Старый 01.10.2009, 11:51   #2  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от grif Посмотреть сообщение
подскажите пожалуйста как быть в такой ситуации.
...
добавление записи с Ind=65 уже не вызывает блокирование т.к. отсутствует блокировка RangeS-U и судя по всему её вызывает GET. Подскажите пожалуйста, как это можно обойти?
GET вызывает блокировку записи перед ней и после неё. Таким образом Вы не можете вставить значение 65 без блокировки. Если работать без GET, то блокировки записей в таблице нет и вы без проблем пытаетесь вставить записи (если не делать 2 раза подряд Insert).
Старый 01.10.2009, 12:01   #3  
grif is offline
grif
Участник
Аватар для grif
 
236 / 10 (1) +
Регистрация: 31.08.2006
Я это понимаю, но в рабочем коде запись может уже существовать и потому нужна проверка. Как быть, чтоб проверка существования была без блокировок?
Пока писал возникла мысль сделать без GET и прочих проверок так:
Код:
IF _OVTR.INSERT THEN;
Вроде работает на тестовых примерах, но не соображу как проверить точно. Профайлер какую-то чушь показывает
Старый 01.10.2009, 13:06   #4  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
IF _OVTR.INSERT THEN;

прекрасно работает! можно не проверять!
Старый 01.10.2009, 13:07   #5  
grif is offline
grif
Участник
Аватар для grif
 
236 / 10 (1) +
Регистрация: 31.08.2006
да что он работает и так понятно... вопрос был в том будет ли блокировка... вроде бы всё нормально и проблем нет
 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:32.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.