아야로
1k
2018-10-12 09:02:32 작성 2018-10-12 09:07:37 수정됨
5
229

DB 트랜젝션 질문입니다


현재 1분 단위로 DB-A에서 DB-B로 최신값들을 그대로 복제하는 배치 스케줄러를 개발중에 있습니다.

여기 사용하는 DB가 비교적 예전 버전인 postgreSQL 9.3이라 on duplicate key 기능이 없는데요.


public void updateService(List list){
	dao.truncateTableB();
	dao.insertList(list);
}

하여 위와 같이 메서드 단위로 트랜젝션을 걸어 테이블 truncate 후 전부 새로이 insert하는 방식을 쓰고자 합니다.

이때 알고싶은 점은 truncate 직후 타이밍 나쁘게 DB-B에 대한 조회 요청이 들어올경우, 사용자가 아무 값도 받지 못하는 상황이 발생하는가 입니다.

트랜젝션이 걸려있으므로 insert까지 완료된 후 완전히 통째로 데이터가 갈아끼워지는건지,

아니면 db에 truncate에 의한 순간 공백이 발생한 후 insert로 데이터가 채워지는건지 알고싶습니다.


도움 좀 부탁드립니다. 감사합니다.

0
0
  • 답변 5

  • isNotEmpty
    2k
    2018-10-12 09:07:14

    사용자가 아무런 값도 못받는 상황이 있을 수 있습니다.

    트렁케이트는 실행 즉시 데이터가 사라집니다. 커밋이 없죠.


    delete 하고, insert 하고 커밋을 하면 사용자는 항상 있는 데이터만 보겠지만

    truncate하고 insert하는 중에 사용자는 빈값을 볼 수 있습니다.

    1
  • 아야로
    1k
    2018-10-12 09:09:19

    isNotEmpty

    답변 감사드립니다.

    truncate는 트랜젝션 설정에 관계없이 즉시 반영되고,

    delete-insert는 트랜젝션으로 묶이어 데이터가 비는 순간이 없다라고 이해한게 맞는지요?

    0
  • isNotEmpty
    2k
    2018-10-12 09:17:47

    네, 맞습니다.

    1
  • 아야로
    1k
    2018-10-12 09:20:12

    isNotEmpty

    덕분에 한 시름 놨습니다. 행복한 하루되세요 ^^

    1
  • basscraft
    2k
    2018-10-12 09:58:19

    말씀하신 것에 조금 첨언을 하자면

    일반적으로 조회의 경우에는 트랜젝션을 보장하지 않습니다.

    truncate 보다는 delete를 사용하신다면 원하는 효과를 볼 수 있을 것 같은데요.


    일반적으로 어플리케이션에서 truncate 명령을 잘 사용하지 않습니다.

    개발자 입장에서 delete 와 truncate 명령의 결과는 같지만

    차이는

    1. 범위를 지정할 수 있냐 없냐

    2. 트랜잭션에 포함되냐 안되냐

    3. 잦은 수행의 경우 index의 단편화가 발생하냐 안하냐

    이정도 라고 생각합니다.


    1
  • 로그인을 하시면 답변을 등록할 수 있습니다.