|
01.10.2009, 11:43 | #1 |
Участник
|
А подскажите пожалуйста как быть в такой ситуации.
Понять её можно на следующем примере. Имеется таблица с первичным ключём по 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. Подскажите пожалуйста, как это можно обойти? |
|
01.10.2009, 11:51 | #2 |
Участник
|
GET вызывает блокировку записи перед ней и после неё. Таким образом Вы не можете вставить значение 65 без блокировки. Если работать без GET, то блокировки записей в таблице нет и вы без проблем пытаетесь вставить записи (если не делать 2 раза подряд Insert).
|
|
01.10.2009, 12:01 | #3 |
Участник
|
Я это понимаю, но в рабочем коде запись может уже существовать и потому нужна проверка. Как быть, чтоб проверка существования была без блокировок?
Пока писал возникла мысль сделать без GET и прочих проверок так: Код: IF _OVTR.INSERT THEN; |
|
01.10.2009, 13:06 | #4 |
Administrator
|
IF _OVTR.INSERT THEN;
прекрасно работает! можно не проверять! |
|
01.10.2009, 13:07 | #5 |
Участник
|
да что он работает и так понятно... вопрос был в том будет ли блокировка... вроде бы всё нормально и проблем нет
|
|