2011-10-11 3 views
0

일괄 작업이 실행될 때 데이터베이스에 100 개의 레코드가 있고 그 100 개의 레코드를 선택하고 처리를 시작한다고 가정 해 보겠습니다. 프로세스 중에 10 번째 레코드에서 오류가 발생하면 이미 처리 된 9 개의 레코드를 모두 롤백해야합니까?배치 작업 트랜잭션

이 시나리오를 어떻게 디자인 할 수 있습니까 ??? 귀하의 제안을 환영합니다.

답변

0

일 경우 일괄 처리 과정에서 오류가 발생하는 경우 성공적인 레코드를 롤백해야한다고 생각합니다.

각 트랜잭션이 커밋되거나 롤백 된 후 데이터베이스 레코드가 일관되고 합법적 인 (DB 및 비즈니스 규칙과 관련하여) 상태가되도록 트랜잭션에서 DB 업데이트를 수행해야합니다.

100 개의 레코드 목록에있는 각 항목을 개별적으로 처리하고 기록 할 수 있다면 각 레코드가 처리되었는지 여부를 나타내는 일종의 플래그 (상태 필드 일 수도 있음)를 사용하는 것이 좋습니다. 그런 다음 레코드를 반복하여 각 레코드를 업데이트하십시오. 오류가 발생하면 어딘가에 기록해 두십시오 (로그 파일, 예외, 오류 테이블 ... 호출). 끝나면 어떤 레코드가 성공했는지, 어떤 레코드가 실패했는지 기록합니다. 그런 다음 다시 돌아가서 나쁜 레코드에 문제가 발생한 원인을 수정하고 건너 뛴 레코드를 다시 처리 할 수 ​​있어야합니다.

100 개의 레코드가 모두 성공 또는 실패해야하는 경우 업데이트를 트랜잭션으로 래핑하여 모두 성공 또는 실패하도록해야합니다. 이것은 수십 개의 레코드 또는 수백 개의 레코드에서 작동하지만 동일한 트랜잭션에서 수천 개의 레코드로 확장하려고하면 확장 성 문제 (성능 및 경쟁 문제)가 발생할 수 있으므로 패턴에 대해 다른 솔루션을 원할 수 있습니다 그런 식으로.

+0

답변을 주셔서 감사합니다. 사실 저는 그런 식으로 만 구현했습니다.나는 다른 전문가들과 어떻게 이런 종류의 처리를하고 있었는지 그리고 그 일을하는 가장 좋은 방법은 무엇입니까 .... 감사합니다. –

0

다른 트랜잭션 세분성이 가능합니다. Java (JTA)는 단일 커밋으로 여러 번 쓰기를 허용합니다.

  1. 열기 트랜잭션이
  2. 쓰기 기록이
  3. 쓰기 기록이
  4. 쓰기 기록이
  5. 오류
  6. 롤백이

대부분의 데이터베이스는 여러 행을 처리 할 수있는 트랜잭션을 지원하거나 기록을 기록합니다.

이것은 매우 일반적입니다.

+0

성공적이었던 모든 레코드를 롤백하는 것이 좋습니다. 귀하의 예제에서 포인트 4까지 모든 것이 좋았고 오류는 포인트 5에서 발생합니다. 이제 모든 성공적인 레코드를 롤백하고 싶습니까? 우리가 모든 성공적인 기록을 저 지르면 깃발로 기록한 다음 일괄 기록으로 다음 번에 나머지 기록 (포인트 5 이상)을 얻을 수 있다고 생각하니? 내 질문은 기본적 으로이 시나리오를 설계하는 가장 좋은 방법은 될 것이라고 ??? 배치 크기를 만든 다음 실패 배치 만 롤백해야합니까? 아니면 세이브 포인트를 작성한 다음 세이브 포인트까지 롤백해야합니까 ??? –

0

SAVEPOINTS을 살펴보십시오. 기본적으로 내부 트랜잭션을 허용합니다. 따라서 작업을 많이하고, SAVEPOINT를 수행하고, 더 많은 작업을 수행 할 수 있으며 마지막 저장 지점으로 롤백 할 수 있습니다. 일이 정말로 잘못되면 전체 트랜잭션을 롤백 할 수 있습니다.

+0

처음에는 자바를 통해 SAVEPOINTS를 시도했지만 (프로 시저를 저장하지 않았습니다) 그것을 허용하고 더 많은 코드와 로직을 필요로하고 상태 열을 가진 데이터베이스 테이블을 유지해야합니다 ... 또한 일종의 성능 문제를 보았습니다 ... 귀하의 제안 마이크 덕분에 ... –

관련 문제