데이터베이스 액세스로 인한 오류로부터 회복섹션 46.7.2중 하나가 실패하기 전에 일부 작업이 성공하는 바람직하지 않은 상황으로 이어질 수 있으며, 그 오류에서 복구 한 후에는 데이터가 일관되지 않은 상태로 남습니다. PL/Python 은이 문제에 대한 솔루션을 무지개 토토적인 하위 트랜잭션 형태로 제공합니다.
두 계정 사이의 전송을 구현하는 함수를 고려하십시오.
함수 생성 송금 _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는 오류를 가로막지 않으며 범위 내에서 실행 된 모든 데이터베이스 작업이 원자 적으로 커밋되거나 롤백되도록합니다. 잠수함 블록의 롤백은 데이터베이스 액세스에서 발생하는 오류로 인한 모든 예외 종료에서 발생합니다. 무지개 토토 적 하위 트랜잭션 블록 내부에서 제기 된 일반 파이썬 예외는 또한 하위 트랜잭션이 롤백되게합니다.
컨텍스트 관리자 구문을 사용하는with
키워드는 Python 2.6에서 기본적으로 사용할 수 있습니다. 이전 Python 버전과의 호환성을 위해서는 SubTransaction Manager 's에 전화 할 수 있습니다.__enter__
and__exit__
enter
and출구
편의성 별명. 자금을 전송하는 예제 기능은 다음과 같이 작성할 수 있습니다.
함수 생성 송금 _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;
문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면