mysql wait_timeout 관련 질문입니다.
429
작성한 질문수 8
안녕하세요. 실무에서 트랜잭션과 관련해서
해결할 이슈가 있어서 급하게 영한님 강의를 듣고 있는데요.
일단 제가 해결하고자 하는 이슈는 다음과 같습니다.
대용량의 파일 데이터를 읽어서 디비에 반영해야 하는데
디비의 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님 그리고 죄송하지만 앞으로는 질문 안내에 있는 것 처럼 강의 학습에 관련된 질문을 올려주시길 부탁드립니다.
저도 마음으로는 도움을 드리고 싶지만, 하루에도 수 많은 분들이 질문을 올려주십니다. 그래서 강의 학습과 관련된 질문에 초점을 맞추는 것이 맞다 생각합니다. 다시한번 이해를 부탁드립니다.
감사합니다.
설정 정보 없이 임베디드 데이터베이스 생성
0
28
1
RepositoryTest의 패키지 위치가 domain인 이유
0
50
2
REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!
0
39
1
update()에 사용하는 setter 질문드립니다.
0
57
1
SQL 중심적 개발의 문제점에 대한 질문
0
86
1
혹시 Containing 을 안쓰신 이유가 있을까요?
0
92
2
[공유] 스프링부트 4.x 버전 mybatis 연동
0
193
1
@repository 어노테이션
0
102
3
ItemService
0
64
1
논리 커밋, 물리 커밋 질문드립니다.
0
55
1
내부 트랜잭션 커밋은 필수인가요?
0
59
1
프록시 커넥션 객체를 반환할 때 생성하는건가요?
0
58
1
Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)
2
184
2
JPQL 대신 네이티브 쿼리를 사용해야 하는 경우
0
83
1
@EventListener(ApplicationReadyEvent.class) 관련
0
94
1
트랜잭션 동기화 매니저와 데이터 소스
0
78
1
DB 관련 강의 개설 계획은 없으신건가요?
0
135
2
물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요
0
98
1
스프링 3 버전 이상 rollbackFor 변경된듯요
1
118
1
트랜잭션 전파 질문.
0
89
1
프로젝트 오픈 에러
0
131
1
외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다
0
85
2
같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환
0
76
1
h2 인메모리 테스트중 예약어 충돌날 경우 대처방법
0
105
1





