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

43.8. 사설 토토 사이트 적 차축

데이터베이스 액세스로 인한 오류로부터 회복섹션 43.7.2일부는 바람직하지 않은 상황으로 이어질 수 있습니다 그중 하나가 실패하기 전에 운영이 성공하고 회복 후 이 오류에서 데이터는 일관되지 않은 상태로 남습니다. PL/Python 은이 문제에 대한 솔루션을 사설 토토 사이트 적 형태로 제공합니다. 차트 변환.

43.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 's로 이체되지 않습니다. 계정.

그러한 문제를 피하기 위해.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;

사용시도/캐치아직도 있습니다 필수의. 그렇지 않으면 예외는 파이썬 스택 및 전체 기능이 A로 중단됩니다.사설 토토 사이트오류,운영테이블에는 행이 없습니다 그것에 삽입되었습니다. Subrantaction Context Manager는 트랩되지 않습니다 오류는 모든 데이터베이스 작업이 실행되도록 보장합니다 그 범위 내에서 원자 적으로 커밋되거나 롤백됩니다. 에이 하위 트랜잭션 블록의 롤백은 모든 종류에서 발생합니다. 예외 종료, 유래 한 오류로 인한 것뿐만 아니라 데이터베이스 액세스. 내부에서 제기 된 일반적인 파이썬 예외 사설 토토 사이트 적 감소 차단 블록은 또한 하위 변환을 유발합니다 롤백하려면.

43.8.2. 더 오래 파이썬 버전

컨텍스트 관리자 구문을 사용하는with키워드는 Python 2.6에서 기본적으로 사용할 수 있습니다. pl/python을 사용하는 경우 이전 파이썬 버전을 사용하면 여전히 명시 적으로 사용할 수 있습니다. 투명하게는 아니지만 감산. 당신은 전화 할 수 있습니다 서브 트랜잭션 관리자__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;

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