Transaction이란?!
Transaction은 여러 오퍼레이션을 하나의 논리적인 작업으로 실행하는 기능이다.
JavaScript
복사
Transaction의 문제점
1.
Lost Reads
두 트랜잭션이 같은 데이터를 업데이트해서 하나의 업데이트가 손실되는 경우
→ Optimistic Lock 전략으로 해결 가능
2.
Dirty Reads
아직 Commit 되지 않은 값을 다른 트랜잭션이 읽는 경우
→ Read Committed 트랜잭션으로 해결 가능하다.
3.
Non-repeatable Reads
한 트랜잭션에서 데이터를 두 번 읽을때 다른 결과가 나오는 경우
→ Repeatable Read 트랜잭션으로 해결 가능하다.
4.
Phantom Reads
첫 Read 이후에 다른 트랜잭션에서 데이터를 추가한 경우
→ Serializable 트랜잭션으로 해결 가능하다.
•
표
적용 하기
DataSource 임포트 하기
typeorm에서 제공하는 DataSource 의존성을 주입한다.
create 함수 - 트랜잭션 준비
1.
queryRunner 로드
2.
connect() 함수로 데이터 베이스 연결
3.
startTransaction() 함수로 트랜잭션 시작
try - catch 구문 설정
1.
try - catch- finally 구문을 만들어 준다.
2.
catch 구문에서 rollbackTransaction() 함수를 구현해서 로직 처리중 하나라도 실패하면 롤백을 처리하게 한다.
3.
release() 함수로 해당 로직이 실패하여 반환된 데이터를 다시 돌려주는 역할을 한다. (원상복귀 시킨다. )
4.
한 트랜잭션으로 묶여아하는 기본 로직들을 다 try - catch 구문 안에 넣어준다.
queryRunner.manager로 실행 객체 변경
const director = await qr.manager.findOne(Director, {
where: { id: createMovieDto.directorId },
});
JavaScript
복사
•
기존 레파지토리 패턴을 쿼리 러너 매니저로 트랜잭션을 관리
•
모든 레파지토리로 실행되던 쿼리함수를 바꿔주면 쿼리러나가 관리할 수 있다.
commit
•
모든 로직에서 이상이 없어야지 커밋
•
커밋하고 나서 다시 호출해서 돌려주는 것은 레파지토리 패턴을 사용해도 상관없음