46.8. 무지개 토토 적 차축

데이터베이스 액세스로 인한 오류로부터 회복섹션 46.7.2중 하나가 실패하기 전에 일부 작업이 성공하는 바람직하지 않은 상황으로 이어질 수 있으며, 그 오류에서 복구 한 후에는 데이터가 일관되지 않은 상태로 남습니다. PL/Python 은이 문제에 대한 솔루션을 무지개 토토적인 하위 트랜잭션 형태로 제공합니다.

46.8.1. 서브 트랜잭션 컨텍스트 관리자

두 계정 사이의 전송을 구현하는 함수를 고려하십시오.

함수 생성 송금 _funds ()는 void를 $$로 반환합니다
노력하다:
    plpy.execute ( "업데이트 계정 세트 밸런스 = 밸런스 -100 여기서 account_name = 'joe'")
    plpy.execute ( "업데이트 계정 세트 밸런스 = 밸런스 + 100 여기서 Account_name = 'Mary'")
plpy.spierror를 제외하고 E :
    결과 = "오류 이체 자금 : % s" % e.args
또 다른:
    결과 = "자금이 올바르게 양도 된 자금"
plan = ply.prepare ( "작업에 삽입 (결과) 값 ($ 1)", [ "텍스트"])
plpy.execute (plan, [결과])
$$ 언어 plythonu;

두 번째 인 경우업데이트명령문은 예외를 제기하고,이 기능은 오류를보고하지만 첫 번째 결과는업데이트그럼에도 불구하고 커밋 될 것입니다. 다시 말해, 자금은 Joe의 계정에서 철회되지만 Mary의 계정으로 이체되지 않습니다.

그러한 문제를 피하려면를 감싸 수 있습니다.plpy.execute무지개 토토 적 감소 작용으로 호출합니다. 그만큼plpy모듈은 헬퍼 객체를 제공하여plpy.subtransaction ()함수. 이 함수에 의해 생성 된 개체 구현Context Manager Interface. 명시 적 하위 트랜잭션을 사용하여 다음과 같이 기능을 다시 작성할 수 있습니다.

함수 생성 송금 _funds2 ()는 void를 $$로 반환합니다
노력하다:
    plpy.subtransaction () :
        plpy.execute ( "업데이트 계정 세트 밸런스 = 밸런스 -100 여기서 account_name = 'joe'")
        plpy.execute ( "업데이트 계정 세트 밸런스 = 밸런스 + 100 여기서 Account_name = 'Mary'")
plpy.spierror를 제외하고 E :
    결과 = "오류 이체 자금 : % s" % e.args
또 다른:
    결과 = "자금이 올바르게 양도 된 자금"
plan = ply.prepare ( "작업에 삽입 (결과) 값 ($ 1)", [ "텍스트"])
plpy.execute (plan, [결과])
$$ 언어 plythonu;

사용try/제외여전히 필요합니다. 그렇지 않으면 예외는 파이썬 스택의 상단으로 전파되며 전체 기능이 A로 중단됩니다.무지개 토토오류,운영테이블에는 행이 삽입되지 않았습니다. Subtransaction Context Manager는 오류를 가로막지 않으며 범위 내에서 실행 된 모든 데이터베이스 작업이 원자 적으로 커밋되거나 롤백되도록합니다. 잠수함 블록의 롤백은 데이터베이스 액세스에서 발생하는 오류로 인한 모든 예외 종료에서 발생합니다. 무지개 토토 적 하위 트랜잭션 블록 내부에서 제기 된 일반 파이썬 예외는 또한 하위 트랜잭션이 롤백되게합니다.

46.8.2. 구형 파이썬 버전

컨텍스트 관리자 구문을 사용하는with키워드는 Python 2.6에서 기본적으로 사용할 수 있습니다. 이전 Python 버전과의 호환성을 위해서는 SubTransaction Manager 's에 전화 할 수 있습니다.__enter__and__exit__enterand출구편의성 별명. 자금을 전송하는 예제 기능은 다음과 같이 작성할 수 있습니다.

함수 생성 송금 _funds_old () void를 $$로 반환합니다
노력하다:
    subxact = plpy.subtransaction ()
    subxact.enter ()
    노력하다:
        plpy.execute ( "업데이트 계정 세트 밸런스 = 밸런스 -100 여기서 account_name = 'joe'")
        plpy.execute ( "업데이트 계정 세트 밸런스 = 밸런스 + 100 여기서 Account_name = 'Mary'")
    제외하고:
        SYS 가져 오기
        subxact.exit (*sys.exc_info ())
        들어올리다
    또 다른:
        subxact.exit (없음, 없음, 없음)
plpy.spierror를 제외하고 E :
    결과 = "오류 이체 자금 : % s" % e.args
또 다른:
    결과 = "자금이 올바르게 양도 된 자금"

plan = ply.prepare ( "작업에 삽입 (결과) 값 ($ 1)", [ "텍스트"])
plpy.execute (plan, [결과])
$$ 언어 plythonu;

정정 제출

문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면