사설 토토 사이트 9.3.25 문서 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.3 : 윈 토토 윈 토토 | PostgreSQL : 문서 : 9.3 : PL/토토 사이트 -토토 사이트 Prossural Language | 43 장. PL/Python -Python Prossural Language | 토토 핫 : 문서 : 9.3 : 유틸리티 함수 |
데이터베이스 액세스로 인한 오류로부터 회복섹션 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 '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는 트랩되지 않습니다 오류는 모든 데이터베이스 작업이 실행되도록 보장합니다 그 범위 내에서 원자 적으로 커밋되거나 롤백됩니다. 에이 하위 트랜잭션 블록의 롤백은 모든 종류에서 발생합니다. 예외 종료, 유래 한 오류로 인한 것뿐만 아니라 데이터베이스 액세스. 내부에서 제기 된 일반적인 파이썬 예외 사설 토토 사이트 적 감소 차단 블록은 또한 하위 변환을 유발합니다 롤백하려면.
컨텍스트 관리자 구문을 사용하는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에서는 미래의 진술을 사용할 수 없습니다 기능.