Transaction??ACID?? 뭔데??

0
post-thumbnail

1. Transaction

  • Transaction이란, 단어 그대로 보면 거래라는 뜻이다. 하지만, 개발에서도 비슷한 부분에서 쓰이긴 한다. 이것은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 뜻한다.
  • 간단히 말해, 질의어(SQL)를 이용하여 데이터베이스를 접근 하는 것을 의미한다.
    (SELECT, INSERT, DELETE, UPDATE)
  • 개발자가 하나의 트랜잭션 설계를 잘하는 것이 데이터를 다루는 것에 많은 이점이 있다.

  • 서비스에서 가장 큰 문제는 데이터의 오염이라고 하는데, 에러가 나오는데 데이터가 계속 저장되면, 데이터베이스 안은 오염이 되어 어지럽기 일쑤다. 그래서 차라리 실패할거면 전체 다 실패하고, 다시 시도하는게 안전하다는게 트랜잭션의 취지이다.

2. TypeOrm Transaction Strategies

  • TypeOrm의 Transaction을 처리하기 위한 다양한 전략이 존재합니다. 간단하게 @Transactional 데코레이터를 사용하여 해당 Method 위에서 간편하게 처리할 수도 있고, Callback Style로 처리할 수도 있다.
  • NestJS에서 강력하게 추천하는 방식은 바로 QueryRunner를 통해 Transaction을 수행하는 것이다. 
    QueryRunner를 사용하면 Transaction의 Commit과 Rollback을 수동으로 제어할 수 있다.
    Unit Testing(단위 테스트)를 보다 쉽게 진행할 수 있다. 즉 Jest를 통한 Testing 시 Mocking을 좀 더 쉽게 할 수 있다.

3. Transaction의 속성들

  • 원자성(Atomicity): 모두 성공할거 아니면 다 실패하게 해줘!!(오염은 싫어!)
  • 일관성(Consistency): 똑같은 쿼리는 조회할 때 마다 동일해야돼!
  • 격리성(Isolation): 재형이꺼 처리하는 동안 짱구는 기다려줄래?!
  • 지속성(Durability): 한번 성공했으면 장애가 발생했어도 살아있어야해!!

4. Transaction의 Commit, Rollback

  • Repository는 @InjectRepository 데코레이터로 의존성 주입을 하지만, Connection 객체는 이미 TypeOrm Module을 import한 것만으로도 의존성을 가져올 수 있다.
    이 의존성을 토대로 createQueryRunner() 함수를 통해 Transaction Manager를 수행할 수 있다.
  • createQueryRunner함수로 queryRunner를 선언하고, Transaction의 시작을 선언해줍니다. Commit, Rollback을 수동으로 제어할 수 있듯이 Transaction의 시작과 끝 또한 제어할 수 있다.
  • 전체 로직을 try-catch-finally 로 감싸주고 Transaction을 처리하는 save method는 repository가 아니라 queryRunner.manager로 대체해 준다.
  • Error 없이 모든 로직을 수행하면 Transaction이 완료되 commitTransactioin을 호출하고, finally에서 release함수를 호출해 Transaction을 종료한다. 만약 중간에 Error가 발생했을 경우 catch에서 잡아내서 rollback을 수행한다.

5. Isolation(추가)

  • READ UNCOMMITTED: 커밋되지 않은 것도 조회해주자.(더러운 읽기)
  • READ COMMITTED: 커밋된 것만 조회하자
  • REPEATABLE READ: Mysql에선 발생하지 않는다.
  • SERIALIZABLE

  • 서로 락이 걸려 오도가도 못하는 상태를 데드락이라고 한다. 저런식으로 개발 하면 안된다!! 그래서 순서있게 잘 정리해야한다.
  • 업데이트 할때 누군가 또 업데이트를 하게 되면 꼬이게 된다. 그래서 락을 걸어야함.

마무리

=> 잘 실행되다가 하나만 에러나고 그러면 데이터가 오염이된다. 어차피 모든 게 구현되지 않을거면, 데이터가 깨끗하게 모든게 다 실패되는게 낫다!! 그래서 롤백을 통해 다시 구현!! isolation 레벨은 항상 높이는것은 좋지 않다. 상황을 봐서 필요한 곳에 사용을 해야만 한다.

profile
끝날때 까지 끝난게 아니야. 결국 내가 이겨!

0개의 댓글

관련 채용 정보