2 Stimmen

Kann eine Unterprozedur die gleichen Zeilen FOR UPDATE sperren und ändern, die die aufrufende Prozedur bereits gesperrt hat?

Wird der folgende Code zu einem Deadlock führen oder sollte er problemlos funktionieren? Ich habe etwas Ähnliches und es funktioniert, aber ich hätte nicht gedacht, dass es das tut. Ich dachte, die Sperre der übergeordneten Prozedur würde zu einem Deadlock für die untergeordnete Prozedur führen, aber das scheint nicht der Fall zu sein.

Wenn es funktioniert, warum? Meine Vermutung ist, dass das verschachtelte FOR UPDATE nicht in ein Deadlock läuft, weil es intelligent genug ist, um zu erkennen, dass es von derselben Prozedur aufgerufen wird, die die aktuelle Sperre hat.

Wäre dies ein Deadlock, wenn FOO_PROC keine verschachtelte Prozedur wäre?

DECLARE
  FOO_PROC(c_someName VARCHAR2) as
    cursor c1 is select * from awesome_people where person_name = c_someName FOR UPDATE;
  BEGIN
    open c1;
    update awesome_people set person_name = UPPER(person_name);
    close c1;
  END FOO_PROC;

  cursor my_cur is select * from awesome_people where person_name = 'John Doe' FOR UPDATE;
BEGIN
  for onerow in c1 loop
    FOO_PROC(onerow.person_name);
  end loop;
END;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X