작성
·
318
1
안녕하세요. 실무에서 트랜잭션과 관련해서
해결할 이슈가 있어서 급하게 영한님 강의를 듣고 있는데요.
일단 제가 해결하고자 하는 이슈는 다음과 같습니다.
대용량의 파일 데이터를 읽어서 디비에 반영해야 하는데
디비의 wait_timeout 시간보다 트랜잭션이 길어져서
타임아웃이 나서 롤백이 되어버립니다.
그래서 영한님 강의 듣고 REQUIRES_NEW 로 다른 트랜잭션을 만들어서 테스트를 해보는 중인데요.
자식 트랜잭션은 성공을 하지만 부모 트랜잭션은 타임아웃으로 롤백이 되는거 같습니다.
아마 강의 내용처럼 Suspending current transaction
이것 때문에 부모 트랜잭션이 대기 상태에 빠져 자식 트랜잭션을 수행후 다시 부모 트랜잭션이 커밋 하려는 시점에 타임아웃이 나는거 같은데... 이런 경우에 어떻게 처리 할 수 있을까요?
그리고 강의를 듣다보니 REQUIRES_NEW 로 트랜잭션을 생성하는건 결국 커넥션풀을 하나씩 사용하는거라 새로 트랜잭션을 계속 생성하는것도 좋은 방법은 아니라는 생각이 드는데요. 다른 대안이 있을지 궁금합니다.
파일의 크기에 따라 일정 정도의 크기로 잘라서 REQUIRES_NEW 로 새로운 트랜잭션을 계속 만들려고 생각했는데 그러면 커넥션풀을 너무 많이 사용하는건 아닐까 하는 생각이 듭니다.
그리고 만약 각각의 트랜잭션으로 분리를 한다면 하나의 트랜잭션에서 에러가 났을 경우 각각 다른 트랜잭션인데 이걸 다시 전부 롤백할 수 있는 방법이 수동으로 하는거 말고는 없을까요?
두서 없이 질문을 드렸는데 정리해보면 다음과 같습니다.
파일 데이터를 읽어서 디비에 반영시 디비 wait_timeout 발생
REQUIRES_NEW 로 새 트랜잭션 만들어서 디비 반영비 자식 트랜잭션 반영 성공, 부모 트랜잭션 타임아웃 롤백
파일 크기에 따라 일정 정도로 잘라서 REQUIRES_NEW 로 새 트랜잭션을 계속 만들어서 디비 반영하는건 커넥션풀을 파일 크기에 따라 너무 많이 먹을거 같은데 다른 대안이 있을지?
만약 각각의 트랜잭션으로 분리해서 반영하다가 하나의 트랜잭션에서 에러가 발생했을 경우 모든 트랜잭션을 롤백할 방법이 있을지?
답변 1
4
안녕하세요. opensesame님^^
데이터를 한번에 반영하기 때문에 발생하는 문제입니다.
이런 경우 데이터가 100만건이면 100 ~ 1만건 정도 단위(적정한 수치는 테스트를 해보셔야 합니다.)로 데이터를 끊어서 저장해야 합니다.
예를 들어서 1만건 단위로 진행한다면
트랜잭션을 시작하고 1~10000 건을 DB에 저장하고, 트랜잭션을 커밋하고
그리고 다시 트랜잭션을 시작하고, 10001~20000건을 DB에 저장하고, 트랜잭션을 커밋하고
이런 방식으로 반복하셔야 합니다.
이런 패턴을 프레임워크로 만든 것이 스프링 배치라 보시면 됩니다.
opensesame님 그리고 죄송하지만 앞으로는 질문 안내에 있는 것 처럼 강의 학습에 관련된 질문을 올려주시길 부탁드립니다.
저도 마음으로는 도움을 드리고 싶지만, 하루에도 수 많은 분들이 질문을 올려주십니다. 그래서 강의 학습과 관련된 질문에 초점을 맞추는 것이 맞다 생각합니다. 다시한번 이해를 부탁드립니다.
감사합니다.
앞으로는 질문 올릴 때 학습과 관련된 질문을 하도록 하겠습니다.
답변 감사합니다! 🙇♂️