Oracle에서 새로운 거래를 시작하기 위해 저장 포인트를 대체 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1514526

문제

현재 레코드 세트를 삽입하는 데 사용하는 프로세스는 다음과 같습니다.

( "레코드 세트"는 주소, 전화 번호 또는 기타 가입 테이블과 함께 개인의 레코드와 같은 것을 의미합니다).

  1. 거래를 시작하십시오.
  2. 관련된 레코드 세트를 삽입하십시오.
  3. 모든 것이 성공적이면 커밋하고 그렇지 않으면 롤백하십시오.
  4. 다음 레코드 세트는 1 단계로 돌아갑니다.

우리는 이런 일을 더해야합니까?

  1. 스크립트의 시작 부분에서 트랜잭션을 시작하십시오
  2. 각 레코드 세트에 대한 저장 포인트를 시작하십시오.
  3. 관련 레코드 세트를 삽입하십시오.
  4. 오류가 있으면 SavePoint로 롤백하십시오. 모든 것이 성공하면 계속하십시오.
  5. 스크립트 시작시 거래를 커밋하십시오.

ORA-01555에 몇 가지 문제가 있고 몇 가지 톰 기사를 읽은 후 이 하나), 두 번째 프로세스를 시도 할 생각입니다. 물론 Tom이 지적한 것처럼 새로운 거래를 시작하는 것은 비즈니스 요구에 의해 정의되어야하는 것입니다. 두 번째 과정은 시도해 볼 가치가 있습니까, 아니면 나쁜 생각입니까?

도움이 되었습니까?

해결책

거래는 의미있는 작업 단위 여야합니다. 그러나 작업 단위를 구성하는 것은 상황에 따라 다릅니다. OLTP 시스템에서는 작업 단위가 주소 정보 등과 함께 한 사람이 될 것입니다. 그러나 마치 많은 형태의 배치 처리를 구현하는 것처럼 들립니다.

ORA-1555에 문제가있는 경우 다른 트랜잭션에서 업데이트되는 데이터를 제공하는 오랜 쿼리가 있기 때문에 거의 확실합니다. 루프 내부에 커밋하면 실행 취소 세그먼트의 주기적 사용에 기여하므로 읽기 일관성을 제공하기 위해 의존하는 세그먼트가 재사용 될 가능성이 높아집니다. 따라서 그렇게하지 않는 것은 아마도 좋은 생각 일 것입니다.

SavePoints를 사용하는 것이 솔루션인지 여부는 다른 문제입니다. 나는 당신의 상황에서 당신에게 어떤 이점을 줄지 잘 모르겠습니다. Oracle10G와 함께 작업 할 때 대량 사용을 고려해야합니다. DML 오류 로깅 대신에.

또는 더 작은 데이터 덩어리와 함께 작동하도록 드라이빙 쿼리를 다시 작성할 수도 있습니다. 프로세스의 세부 사항에 대해 더 많이 알지 못하고 구체적인 조언을 할 수 없습니다. 그러나 일반적으로 10000 레코드를 위해 커서 하나를 열지 않고 500 행을 위해 20 번 팝을 열는 것이 좋습니다. 고려해야 할 또 다른 사항은 벌크 수집을 사용하여 삽입 프로세스를보다 효율적으로 만들 수 있는지 여부입니다.

다른 팁

몇 가지 생각 ...

  1. AskTom 링크의 요점 중 하나는 1555 년을 피하기 위해 롤백/실행 취소를 적절하게 실행 취소하는 것 같습니다. 이것이 불가능한 이유가 있습니까? 그가 지적했듯이, 롤백 제한을 해결하기 위해 코드를 작성/유지 관리하는 것보다 디스크를 구입하는 것은 훨씬 저렴합니다 (36GB 드라이브를 위해 250 달러의 프리 세타 태그를 읽은 후 더블 테이크를해야했지만 2002 년에 시작된 스레드가 시작되었습니다. ! 무어의 법칙에 대한 좋은 삽화!)
  2. 이 링크 (Burleson) SavePoints에서 가능한 한 가지 문제를 보여줍니다.
  3. 두 번째 시나리오에서 실제로 2 단계 및 5 단계에서 거래가 있습니까? 그렇다면 그것이 내가하는 일입니다. 각 거래를 저지르십시오. 시나리오 1처럼 나에게 약간 들린다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top