팀내에서 지적사항이 나왔는데 자꾸 얘기가 챗바퀴처럼 돌아서 너무 답답해서 물어봄



1. 우선 현재 만들어야 하는 기능 설명


일단 14개 테이블에 평균 9000건 정도의 update가 필요한 상황임


먼저 특정 데이터가 쭉 들어오는데 이걸 14개 테이블에 넣기 위해 지지고 볶고 가공을 함


최종적으로 14개 리스트를 만들어서 각 테이블에 delete 후 insert하고 있음


전임자가 여기까지 코딩하고 퇴사한걸 내가 이어받은 상황



2. 문제가 된 상황


전임자가 코딩해 놓은게 트랜잭션 처리가 안돼 있음


간에 뻑나면 데이터 정합성이 안맞을테니 14개 테이블 delete랑 insert하는거 전부 1개 트랜잭션으로 묶어 놓음



3. 지적 내용


근데 이걸 보더니 트랜잭션에 최대 크기가 있어서 db가 죽을거라고, 죽으면 큰일난다고 지적이 들어오는거임


??? 하면서 중간에 에러 나면 롤백 안되는데 그게 더 큰일 아니냐고 되물음


그러니까 그것도 맞는 말인데 죽을걸 뻔히 알면서 돌리면 안된다고 그러는거임


그랬더니 나온 소리가 끊어서 처리를 하면 된다는거임


참고로 기존에는 insert를 100건씩 끊어서 for루프 돌리고 있고, 이게 이 사람이 트랜잭션 크기 지적해서 바꾼 내용인거 같더라


테이블마다 100건 x 90번 하는거니까 어차피 정합성 보장 안되는건 마찬가지긴 한데 아무튼 그래서 끊어서 날리는듯


사실 나는 한번에 날리는 쿼리 최대 길이에 제한이 있어서 이렇게 코딩해 놓은줄 알았음



4. 지적한 사람이 제시한 해결 방법


이게 제일 이해가 안되는데 역시나 끊어서 날려야 된다는 소리가 나옴


한꺼번에 하는건 db가 죽을 수도 있으니, 정합성 보장을 위해서는 끊어서 해야 한다고 함


참고로 처음에 들어오는게 9000건인거고 각 테이블에 update해야 하는 데이터는 1건당 여러개일 수 있음


그래서 리스트 사이즈도 제각각이기 때문에 딱 맞춰서 보내려면 리스트 다시 돌면서 맞는거 골라와야 하는 상황


이것도 걍 그렇다 치자. 근데 이런 식으로 날리면 db쪽도 속도 저하 문제가 심각할거 아님?


근데 해결책이라고 제시한게 병렬처리로 한 100개 쓰레드 만들어서 날리면 된다는거임



5. 내가 이해가 안가는 부분 & 질문


애초에 100개 쓰레드 만든다고 그게 동시에 작동이 되긴 하나? 하드웨어적으로다가


db도 마찬가지로 이거 받을 능력 됨? 참고로 PostgreSQL임


이론상 이게 더 빠른게 맞긴 함? 쓰레드마다 커넥션풀 새로 만들어야 해서 오히려 for문 돌려서 날리는거보다 느릴거 같은데


그리고 트랜잭션에 최대 크기가 있는게 맞긴 함? 걍 하드웨어 문제 아니고?


마지막으로 쿼리 최대 길이에 제한이 있음? 많으면 18만건 insert할 수도 있는데 제한이 있다면 끊어 날리는게 맞긴 하니까