![]() |
#35 |
Участник
|
А подскажите пожалуйста как быть в такой ситуации.
Понять её можно на следующем примере. Имеется таблица с первичным ключём по 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; 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 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. Подскажите пожалуйста, как это можно обойти? |
|