Показать сообщение отдельно
Старый 01.10.2009, 11:43   #57  
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. Подскажите пожалуйста, как это можно обойти?