|
안녕하세요. 정진후라고 합니다.
제가 하고자 하는 처리에 대해 보통 텍스트 에디터를 예로 들어 질문하겠습니다.
일반 에디터로 텍스트파일(*.txt) 파일을 열고 수정을 한 다음 파일 메뉴에서
이름바꿔 저장을 하게되면 원본과 수정본이 모두 훌륭하게 저장 되지요.
제가 하고 있는 처리도 위의 수순과 큰 차이가 없습니다. 파일을 선택하듯
부모 테이블에서 어떠한 레코드를 선택하면 자식 테이블로 액세스하여
변경을 하고 수정/저장을 하는 것이지요.
좀 더 상세히 설명하면 부모 테이블에서 레코드가
선택(에디터에서 파일 선택과 비슷한 개념입니다) 되면 StartTransaction()이 걸리고
자식 테이블의 레코드를 수정 하고 종료시에 "저장/파기/이름변경 저장"
메뉴를 선택하게 한 다음, 저장이 선택되면 Commit(), 파기가 선택되면 Rollback()을
호출하는 수순입니다. 그런데 텍스트 에디터에서는 간단한 '이름변경 저장'이 제 어플리
에서는 좀 골치가 아픕니다.
자식 테이블의 수정을 컴퍼넌트 탭의 "DataControls' 의 소속 디비 컴퍼넌트(디비 에디터 등등)
을 이용해서 하기 때문에 어떻게든 명시적으로 커밋이나 롤백을 선택해야 합니다.
근데 커밋을 하면 바로 원본이 수정된 레코드 대로 저장되어 버리고 롤백을 하면
애써 수정했던 레코드들이 '팍' 날아가버리지요.
그래서 지금 하고 있는 처리는 자식 테이블의 변경된 데이터 들을 트랜잭션의 영향을
안받는 다른 방법(저는 구조체를 선언하여)으로 수정된 레코드 들을 저장하여 둔 다음,
롤백을 하여, 수정분을 날림으로서 원본을 보존하고 그담에 구조체에 담아 둔 정보를
어떤 쿼리에다가 계속 루프로 Append() 하는 방법을 쓰고 있습니다.
그런데 저는 왠지 그러한 방법이 마음에 들지도 않고, (왠지 더 좋은 방법이 있을 것만 같은 기분)
문제도 발생하고요(뭐 ORA-12571 이던가요 루프를 2-300번쯤 돌다가 패킷 쓰는데 실패했다는데
무슨 소린지 도통 모르겠습니다)
뭐 설명이 조금 혼동스러운 것 같지만 요약을 하지만 일반적인 트랜잭션의 처리와
이름변경 저장 같은 트랜잭션을 넘나드는 처리를 병용하는 방법을 알고 싶습니다.
|