43.8. 거래 관리#

다음에 의해 호출된 절차에서전화명령 및 익명 코드 블록(DO명령), 다음 명령을 사용하여 트랜잭션을 종료할 수 있습니다.커밋그리고롤백. 이러한 명령어를 사용하여 배트맨 토토이 종료된 후 자동으로 새로운 배트맨 토토이 시작되므로 별도의 작업은 없습니다.거래 시작명령. (참고하세요시작그리고ENDPL/pgSQL에서는 다른 의미를 갖습니다.)

다음은 간단한 예입니다:

프로시저 생성 transaction_test1()
언어 plpgsql
AS $$
시작
    0..9 루프에 대한 i
        test1에 삽입 (a) 값 (i);
        IF i % 2 = 0이면
            커밋;
        그 외
            롤백;
        종료하면;
    엔드 루프;
끝;
$$;

전화 transaction_test1();

새로운 트랜잭션은 트랜잭션 격리 수준과 같은 기본 트랜잭션 특성으로 시작됩니다. 트랜잭션이 루프에서 커밋되는 경우 이전 트랜잭션과 동일한 특성으로 새 트랜잭션을 자동으로 시작하는 것이 바람직할 수 있습니다. 명령커밋 및 체인그리고롤백 및 체인이것을 성취하라.

거래 제어는 다음에서만 가능합니다.전화또는DO최상위 수준 또는 중첩 호출전화또는DO다른 개입 명령 없이 호출됩니다. 예를 들어 호출 스택이 다음과 같은 경우CALL proc1()CALL proc2()CALL proc3()이면 두 번째 및 세 번째 프로시저가 트랜잭션 제어 작업을 수행할 수 있습니다. 그러나 호출 스택이 다음과 같다면CALL proc1()선택 func2()CALL proc3(), 다음으로 인해 마지막 프로시저는 트랜잭션 제어를 수행할 수 없습니다.선택사이에.

커서 루프에는 특별한 고려사항이 적용됩니다. 다음 예를 고려해보세요.

프로시저 생성 transaction_test2()
언어 plpgsql
AS $$
선언
    r 기록;
시작
    FOR r IN SELECT * FROM test2 ORDER BY x LOOP
        INSERT INTO test1 (a) VALUES (r.x);
        저지르다;
    엔드 루프;
끝;
$$;

호출 transaction_test2();

일반적으로 커서는 트랜잭션 커밋 시 자동으로 닫힙니다. 그러나 이와 같은 루프의 일부로 생성된 커서는 첫 번째에 의해 자동으로 유지 가능한 커서로 변환됩니다.커밋또는롤백. 이는 커서가 처음에 완전히 평가되었음을 의미합니다.커밋또는롤백행 단위가 아닌. 커서는 루프 후에도 자동으로 제거되므로 대부분 사용자에게는 보이지 않습니다.

읽기 전용이 아닌 명령에 의해 구동되는 커서 루프에서는 배트맨 토토 명령이 허용되지 않습니다(예를 들어업데이트...반환 중).

예외 핸들러가 있는 블록 내에서는 배트맨 토토을 종료할 수 없습니다.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.