이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 동일한 페이지를 볼 수 있습니다사설 토토 사이트 : 문서 : 17 : 44.7. 명시 적 차축버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

42.8. 스포츠 토토 적 차축

설명대로 데이터베이스 액세스로 인한 오류에서 복구 안에섹션 42.7.2일부는 바람직하지 않은 상황으로 이어질 수 있습니다 그중 하나가 실패하기 전에 운영이 성공하고 회복 후 이 오류에서 데이터는 일관되지 않은 상태로 남습니다. PL/Python 은이 문제에 대한 솔루션을 다음의 형태로 제공합니다. 명시 적 감소 작용.

42.8.1. 서브 스포츠 토토 컨텍스트 관리자

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

함수 만들기 송금 _funds ()는 $$로 무효를 반환합니다
노력하다:
    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. 명시 적 사용 Subtransactions 우리는 다음과 같이 기능을 다시 작성할 수 있습니다.

함수 생성 송금 _funds2 ()는 $$로 무효를 반환합니다
노력하다:
    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;

사용시도/캐치IS 여전히 필요합니다. 그렇지 않으면 예외가 전파됩니다 파이썬 스택의 상단과 전체 기능이 A 중단PostgreSQL오류, 그래서운영테이블은 그렇지 않습니다 그것에 삽입 된 행이 있습니다. 잠수함 컨텍스트 관리자는 오류를 가로막지 않고 모든 데이터베이스를 보장합니다. 범위 내에서 실행되는 작업은 원자 적으로됩니다 커밋 또는 롤백. 잠수함의 롤백 블록은 모든 종류의 예외 종료에서 발생합니다. 데이터베이스 액세스에서 발생하는 오류로 인해 발생합니다. 일반 스포츠 토토 적 하위 트랜잭션 블록 내부에서 제기 된 파이썬 예외 또한 잠수함이 롤백되게 할 것입니다.

42.8.2. 구형 파이썬 버전

컨텍스트 관리자 구문을 사용하는with키워드는 Python에서 기본적으로 사용할 수 있습니다 2.6. 이전 파이썬 버전과 함께 PL/Python을 사용하는 경우 비록 명시 적 하위 트랜잭션을 사용할 수는 있지만 여전히 가능합니다 투명하게. SubTransaction Manager의 호출에 전화 할 수 있습니다.__enter____exit__사용 함수enter출구편의성 별명. 자금을 전송하는 예제 기능 다음과 같이 쓸 수 있습니다.

함수 생성 송금 _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;

참고 :컨텍스트 관리자가 구현되었지만 Python 2.5에서 사용하려면with해당 버전의 구문을 사용해야합니다미래 성명서. 때문에 그러나 구현 세부 사항은 미래를 사용할 수 없습니다 pl/python 함수의 진술.