| PostgreSQL 9.2.24 문서 | ||||
|---|---|---|---|---|
| PostgreSQL : 문서 : 9.2 : 메이저 토토 사이트 메이저 토토 사이트 | 위로 | 42장. PL/Python - Python 절차 언어 | 토토 결과 : 문서 : 9.2 : 토토 결과 함수 | |
설명된 대로 데이터베이스 액세스로 인해 발생한 오류 복구 중 에서섹션 42.7.2일부는 바람직하지 않은 상황으로 이어질 수 있습니다. 작업 중 하나가 실패하기 전과 복구 후에 작업이 성공합니다. 해당 오류로 인해 데이터가 일관되지 않은 상태로 남아 있습니다. PL/Python은 이 문제에 대한 솔루션을 다음과 같은 형태로 제공합니다. 명시적인 하위 트랜잭션.
둘 사이의 전송을 구현하는 함수를 고려해보세요 계정:
함수 만들기 transfer_funds() $$로 무효 반환
시도해 보세요:
plpy.execute("계정 업데이트 SET 잔액 = 잔액 - 100 WHERE account_name = 'joe'")
plpy.execute("계정 업데이트 SET 잔액 = 잔액 + 100 WHERE account_name = 'mary'")
plpy.SPIError 제외, e:
result = "자금 이체 오류: %s" % e.args
그 외:
결과 = "자금이 올바르게 이체되었습니다"
plan = plpy.prepare("INSERT INTO 작업(결과) VALUES ($1)", ["text"])
plpy.execute(계획, [결과])
$$ 언어 plpythonu;
만약 두 번째업데이트성명 결과적으로 예외가 발생하면 이 함수는 보고합니다. 오류가 발생했지만 첫 번째 결과는 다음과 같습니다.업데이트그럼에도 불구하고 커밋됩니다. 다른 곳에서는 즉, 자금은 Joe의 계좌에서 인출되지만 Mary의 계정으로 이전되지 않습니다.
이러한 문제를 방지하려면 다음을 포장할 수 있습니다.plpy.execute토토 사이트적인 호출 하위 거래.plpy모듈 토토 사이트적인 하위 트랜잭션을 관리하기 위한 도우미 개체를 제공합니다. 이는로 생성됩니다.plpy.subtransaction()함수. 생성된 개체 이 함수로 다음을 구현합니다.컨텍스트 관리자 인터페이스. 명시적 사용 하위 트랜잭션에서 함수를 다음과 같이 다시 작성할 수 있습니다.
함수 생성 transfer_funds2() $$로 무효 반환
시도해 보세요:
plpy.subtransaction()을 사용하여:
plpy.execute("계정 업데이트 SET 잔액 = 잔액 - 100 WHERE account_name = 'joe'")
plpy.execute("계정 업데이트 SET 잔액 = 잔액 + 100 WHERE account_name = 'mary'")
plpy.SPIError 제외, e:
result = "자금 이체 오류: %s" % e.args
그 외:
결과 = "자금이 올바르게 이체되었습니다"
plan = plpy.prepare("INSERT INTO 작업(결과) VALUES ($1)", ["text"])
plpy.execute(계획, [결과])
$$ 언어 plpythonu;
다음의 사용에 유의하세요시도/잡기이다 여전히 필요합니다. 그렇지 않으면 예외가 다음으로 전파됩니다. Python 스택의 맨 위에 위치하며 전체 함수가 a로 중단포스트그레SQL오류, 그래서작업테이블은 그렇지 않습니다 거기에 행을 삽입하십시오. 하위 트랜잭션 컨텍스트 관리자는 오류를 잡아내지 않고 모든 데이터베이스가 오류를 해당 범위 내에서 실행되는 작업은 원자적으로 수행됩니다. 커밋되거나 롤백됩니다. 하위 트랜잭션 롤백 차단은 예외 종료뿐만 아니라 모든 종류의 예외 종료에서 발생합니다. 데이터베이스 액세스로 인한 오류로 인해 발생했습니다. 정규 명시적인 하위 트랜잭션 블록 내에서 Python 예외가 발생했습니다. 또한 하위 트랜잭션이 롤백될 수도 있습니다.
다음을 사용하는 컨텍스트 관리자 구문와키워드는 Python에서 기본적으로 사용 가능 2.6. 이전 Python 버전에서 PL/Python을 사용하는 경우 명시적인 하위 트랜잭션을 사용하는 것은 여전히 가능합니다. 투명하게. 하위 거래 관리자에게 전화하실 수 있습니다.__enter__그리고__exit__함수를 사용하는입력그리고출구편의 별칭. 자금을 이체하는 예제 함수 다음과 같이 쓸 수 있습니다:
함수 생성 transfer_funds_old() $$로 무효 반환
시도해 보세요:
subxact = plpy.subtransaction()
subxact.enter()
시도해 보세요:
plpy.execute("계정 업데이트 SET 잔액 = 잔액 - 100 WHERE account_name = 'joe'")
plpy.execute("계정 업데이트 SET 잔액 = 잔액 + 100 WHERE account_name = 'mary'")
제외:
수입 시스템
subxact.exit(*sys.exc_info())
올리다
그 외:
subxact.exit(없음, 없음, 없음)
plpy.SPIError 제외, e:
result = "자금 이체 오류: %s" % e.args
그 외:
결과 = "자금이 올바르게 이체되었습니다"
plan = plpy.prepare("INSERT INTO 작업(결과) VALUES ($1)", ["text"])
plpy.execute(계획, [결과])
$$ 언어 plpythonu;
참고:컨텍스트 관리자가 구현되었지만 Python 2.5에서는 다음을 사용합니다.와해당 버전의 구문을 사용해야 합니다.미래 진술. 때문에 구현 세부 사항은 향후 사용할 수 없습니다. PL/Python 함수의 명령문.