deadlock в процедуре: почему?

Замученный
Дата: 19.10.2005 23:53:00
Подскажите, почему на строчке
update zzz set zr = :sum_tmp where id = :idd;
IBExpert говорит мне deadlock?
Вот текст ХП:

CREATE PROCEDURE NEW_PROCEDURE 
RETURNS (
    IDD INTEGER)
AS
DECLARE VARIABLE SUM_TMP INTEGER;
DECLARE VARIABLE SUM1 INTEGER;
DECLARE VARIABLE IDM INTEGER;
begin

 for select t.idclient from table1 t order by 1 desc into :idm
  do
   begin
    select zt.zr from zzz zt where zt.id=:idm into :sum1;
    for select DID from getparents (:idm) where DID<>:idm into :idd
     do
      begin
       select zt.zr from zzz zt where zt.id=:idd into :sum_tmp;
       sum_tmp = :sum_tmp-sum1;
       update zzz set zr = :sum_tmp where id = :idd;
      end
   end

end
Гаджимурадов Рустам
Дата: 20.10.2005 02:37:10
1. Join знаешь что такое? Почему не используешь?
2. Твоя getparents что делает? Только get? Никаких set? Если только get, то дело в deadlock - параллельные транзакции.

Проверь при отключенных пользователях (на тестовой БД, например) - если пройдет, значит натуральный deadlock.
Если нет, то рассказывай дальше (с ДДЛами).
Замученный
Дата: 20.10.2005 06:54:42
Спасибо что откликнулись. Не думал, что помогут.
Гаджимурадов Рустам
1. Join знаешь что такое? Почему не используешь?

Что такое JOIN я знаю, но не пойму как он здесь применим?
Гаджимурадов Рустам
2. Твоя getparents что делает? Только get? Никаких set? Если только get, то дело в deadlock - параллельные транзакции.
getparents(id) и впрямь только get. А как можно избавиться от deadlocka?

P.S.
ХП getparents(id) возвращает из table1 предков (а вообще это цикл, по таблице вверх по иерархии).
kdv
Дата: 20.10.2005 10:27:18
deadlock это вообще то просто ошибка обновления записей, которые УЖЕ обновлены другой еще не завершенной транзакцией.
AndriyKo
Дата: 20.10.2005 10:47:13
Замученный
Спасибо что откликнулись. Не думал, что помогут.
Гаджимурадов Рустам
1. Join знаешь что такое? Почему не используешь?

Что такое JOIN я знаю, но не пойму как он здесь применим?

Рустам имеет в виду, что вместо
for select t.idclient from table1 t order by 1 desc into :idm
  do
   begin
    select zt.zr from zzz zt where zt.id=:idm into :sum1;
вполне можно использовать
for select t.idclient,zt.zr from table1 t left join zzz zt
 on zt.id=t.idclient
 order by 1 desc into :idm,:sum1;
И ещё. Переменные sum1,sum_tmp у тя нигде в 0 не сбрасываются и на нулл не проверяются. Можешь наступить.
По поводу дэдлока. Кроме эксперта никто к БД не подключён ?
nizkzin
Дата: 20.10.2005 10:51:47
ну вот началось!
ты читал вобще статью про deadlock?
а ну бегом на ibase.ru там очень популярно написано!
что это такое, что такое холостой update, и другие вещи.
и вобще разберись с работой транзакций!!!!!!!!!
is it clear?
VF
Дата: 20.10.2005 15:39:13
опа...
оно уже крутой стало, советы даёт, да ещё в такой категорической форме...