Oracle에서 새로운 거래를 시작하기 위해 저장 포인트를 대체 할 수 있습니까?
-
19-09-2019 - |
문제
현재 레코드 세트를 삽입하는 데 사용하는 프로세스는 다음과 같습니다.
( "레코드 세트"는 주소, 전화 번호 또는 기타 가입 테이블과 함께 개인의 레코드와 같은 것을 의미합니다).
- 거래를 시작하십시오.
- 관련된 레코드 세트를 삽입하십시오.
- 모든 것이 성공적이면 커밋하고 그렇지 않으면 롤백하십시오.
- 다음 레코드 세트는 1 단계로 돌아갑니다.
우리는 이런 일을 더해야합니까?
- 스크립트의 시작 부분에서 트랜잭션을 시작하십시오
- 각 레코드 세트에 대한 저장 포인트를 시작하십시오.
- 관련 레코드 세트를 삽입하십시오.
- 오류가 있으면 SavePoint로 롤백하십시오. 모든 것이 성공하면 계속하십시오.
- 스크립트 시작시 거래를 커밋하십시오.
ORA-01555에 몇 가지 문제가 있고 몇 가지 톰 기사를 읽은 후 이 하나), 두 번째 프로세스를 시도 할 생각입니다. 물론 Tom이 지적한 것처럼 새로운 거래를 시작하는 것은 비즈니스 요구에 의해 정의되어야하는 것입니다. 두 번째 과정은 시도해 볼 가치가 있습니까, 아니면 나쁜 생각입니까?
해결책
거래는 의미있는 작업 단위 여야합니다. 그러나 작업 단위를 구성하는 것은 상황에 따라 다릅니다. OLTP 시스템에서는 작업 단위가 주소 정보 등과 함께 한 사람이 될 것입니다. 그러나 마치 많은 형태의 배치 처리를 구현하는 것처럼 들립니다.
ORA-1555에 문제가있는 경우 다른 트랜잭션에서 업데이트되는 데이터를 제공하는 오랜 쿼리가 있기 때문에 거의 확실합니다. 루프 내부에 커밋하면 실행 취소 세그먼트의 주기적 사용에 기여하므로 읽기 일관성을 제공하기 위해 의존하는 세그먼트가 재사용 될 가능성이 높아집니다. 따라서 그렇게하지 않는 것은 아마도 좋은 생각 일 것입니다.
SavePoints를 사용하는 것이 솔루션인지 여부는 다른 문제입니다. 나는 당신의 상황에서 당신에게 어떤 이점을 줄지 잘 모르겠습니다. Oracle10G와 함께 작업 할 때 대량 사용을 고려해야합니다. DML 오류 로깅 대신에.
또는 더 작은 데이터 덩어리와 함께 작동하도록 드라이빙 쿼리를 다시 작성할 수도 있습니다. 프로세스의 세부 사항에 대해 더 많이 알지 못하고 구체적인 조언을 할 수 없습니다. 그러나 일반적으로 10000 레코드를 위해 커서 하나를 열지 않고 500 행을 위해 20 번 팝을 열는 것이 좋습니다. 고려해야 할 또 다른 사항은 벌크 수집을 사용하여 삽입 프로세스를보다 효율적으로 만들 수 있는지 여부입니다.
다른 팁
몇 가지 생각 ...
- AskTom 링크의 요점 중 하나는 1555 년을 피하기 위해 롤백/실행 취소를 적절하게 실행 취소하는 것 같습니다. 이것이 불가능한 이유가 있습니까? 그가 지적했듯이, 롤백 제한을 해결하기 위해 코드를 작성/유지 관리하는 것보다 디스크를 구입하는 것은 훨씬 저렴합니다 (36GB 드라이브를 위해 250 달러의 프리 세타 태그를 읽은 후 더블 테이크를해야했지만 2002 년에 시작된 스레드가 시작되었습니다. ! 무어의 법칙에 대한 좋은 삽화!)
- 이 링크 (Burleson) SavePoints에서 가능한 한 가지 문제를 보여줍니다.
- 두 번째 시나리오에서 실제로 2 단계 및 5 단계에서 거래가 있습니까? 그렇다면 그것이 내가하는 일입니다. 각 거래를 저지르십시오. 시나리오 1처럼 나에게 약간 들린다.