롤 토토 : 문서 : 9.5 : | |||
---|---|---|---|
PostgreSQL : 문서 : 9.5 : 롤 토토 액세스 | PostgreSQL : 문서 : 9.5 : PL/토토 사이트 -토토 사이트 Prossural Language | CHAPTER 43. PL/PYTHON -PYTHON PROGITURAL LANGUAGE | 사설 토토 : 문서 : 9.5 : 유틸리티 함수 |
데이터베이스 액세스로 인한 오류로부터의 복구섹션 43.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 ()는 $$로 무효를 반환합니다 노력하다: 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로 중단됩니다.토토 커뮤니티오류,운영테이블에는 행이 삽입되지 않았습니다. Subtransaction Context Manager는 오류를 가로막지 않으며 범위 내에서 실행 된 모든 데이터베이스 작업이 원자 적으로 커밋되거나 롤백되도록합니다. 잠수함 블록의 롤백은 데이터베이스 액세스에서 발생하는 오류로 인한 모든 예외 종료에서 발생합니다. 토토 커뮤니티 적 하위 트랜잭션 블록 내부에서 제기 된 일반 파이썬 예외는 또한 하위 트랜잭션이 롤백되게합니다.
컨텍스트 관리자 구문을 사용하는with키워드는 Python 2.6에서 기본적으로 사용할 수 있습니다. 구형 Python 버전과 함께 PL/Python을 사용하는 경우에도 투명하지는 않지만 명시 적 하위 트랜잭션을 사용할 수 있습니다. SubTransaction Manager의 호출에 전화 할 수 있습니다.__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 기능에서 향후 진술을 사용할 수 없습니다.