programing

FOR UPDATE OF와 FOR UPDATE의 차이

codeshow 2023. 8. 26. 00:06
반응형

FOR UPDATE OF와 FOR UPDATE의 차이

사용 시 차이가 무엇입니까?FOR UPDATE OF SAL아니면 간단히 쓰시오.FOR UPDATE.

오라일리에 의하면

FOR UPDATE 절의 OF 목록은 나열된 열만 변경하도록 제한하지 않습니다.잠금은 여전히 모든 행에 있습니다. OF 목록은 변경하려는 항목을 보다 명확하게 문서화할 수 있는 방법을 제공합니다.쿼리에서 FOR UPDATE를 간단히 지정하고 OF 키워드 뒤에 하나 이상의 열을 포함하지 않으면 데이터베이스는 FROM 절에 나열된 모든 테이블에서 식별된 모든 행을 잠급니다.

즉, 열 이름을 지정할 때FOR UPDATE OF SAL다른 사용자가 변경할 수 있습니다.SAL열에만 해당합니다.하지만, 실질적으로, 이것은 사실이 아닙니다.다른 세션에서 아직 시간이 남아 있어요.누가 그 차이를 설명할 수 있습니까?

갱신하다

 ----- SESSION 1

declare
 emp_info emp.ename%type;
 cursor emp_cur is select ename from emp join dept using(deptno) where deptno=&no for update of sal;
 begin
 open emp_cur;
 loop
 fetch emp_cur into emp_info;
 exit when emp_cur%notfound;
 dbms_output.put_line(emp_info);
 end loop;
 close emp_cur;
 end;

  ----- SESSION 2

  update emp set comm=5 where deptno=10;
  ---- hanged/waiting in session 2

Oracle 설명서에서 다음을 참조하십시오.

사용OF ...결합된 특정 테이블 또는 뷰에 대해서만 선택한 행을 잠급니다.의 열OF절은 잠긴 테이블 또는 뷰 행만 나타냅니다.지정한 특정 열은 유의하지 않습니다.그러나 열 별칭이 아닌 실제 열 이름을 지정해야 합니다.이 절을 생략하면 데이터베이스는 쿼리의 모든 테이블에서 선택한 행을 잠급니다.

쿼리가 단일 테이블을 참조하는 경우 다음과 같은 차이가 없습니다.FOR UPDATE그리고.FOR UPDATE OF ...그러나 후자는 업데이트할 열을 나타내는 자체 설명으로 여전히 유용할 수 있습니다.업데이트할 수 있는 내용을 제한하지는 않습니다.다음이 있는 경우:

CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;

그래도 할 수 있습니다.

UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;

하지만 테이블이 두 개 이상인 경우FOR UPDATE OF ...에서 지정한 열을 포함하는 테이블의 행만 잠급니다.OF

질문에서 말씀하신 것과는 반대로. 구체적으로.FOR UPDATE OF sal잠글 뿐만 아니라sal열. 최소 잠금이 행 레벨에 있으므로 단일 열은 절대로 잠글 수 없습니다. (잠금에 대한 자세한 내용은 여기를 참조하십시오.다음을 포함하는 테이블의 모든 행을 잠급니다.SAL열 - 쿼리에 의해 선택됩니다.


질문에 대한 업데이트에서 커서 쿼리가 참여하고 있습니다.emp그리고.dept그러나OF조항만 가지고 있습니다.sal의 칼럼.emp테이블. 의 행들.emp커서가 열리면 테이블이 잠기고 사용자가 잠금을 해제할 때까지 해당 잠금이 해제되지 않습니다.commit또는rollback그회기 커서 에서 다음 수행할 수 .커서 루프 내에서 다음 작업을 수행할 수 있습니다.

UPDATE emp SET ... WHERE CURRENT OF emp_cur;

의 합니다.emp이 루프 반복과 관련된 테이블입니다. 수 없는 작업:

UPDATE dept SET ... WHERE CURRENT OF emp_cur;

왜하면행에 dept 있지 . 이는 때문입니다. 열이 없기 때문입니다.OF그것은 또한 당신의 두 번째 세션에서dept행은 첫 번째 세션에 의해 잠기지 않으므로 자유롭게 업데이트할 수 있습니다.

업데이트를 위한 추가 설명 하나.여러 테이블에서 선택한 경우 업데이트를 위해 각 테이블을 참조하기 위한 where 절이 없는 경우 업데이트가 완료될 때까지 모든 테이블이 잠깁니다.

언급URL : https://stackoverflow.com/questions/16081582/difference-between-for-update-of-and-for-update

반응형