얼음꽃의 일지

[JS] sequelize transaction 직접 걸기 본문

잡다한 지식

[JS] sequelize transaction 직접 걸기

얼음꽃 2023. 10. 29. 12:37
728x90

sequelize 가 설치되었다는 가정하에 작성되었습니다.

 

transaction을 직접 걸어두는게 아니면 DB 설정에 따라 자동적으로 잡힙니다.

 

보통은 Auto Commit 형태로 되어있습니다.

 

근데 Auto Commit이 아닌 직접 거는 상황을 보여드립니다.

 

일단 Transaction은 보통 수행하는 작업의 단위를 묶기 위해서 사용하죠.

 

Transaction을 사용하게 됐을때 제가 느낀 장단점은

 

[장점]

1. 한번에 묶어서 수행하기 때문에 확인하기 편함

2. 서버나 타 이슈로 인해 에러 발생시 한꺼번에 롤백이 되기때문에 강제로 commit 될 위험 없음

3. 원하는 곳에서 commit 할 수 있도록 설정 가능

 

[단점]

1. transaction 적용하면서 속도가 조금 느려짐

-> 속도는 transaction을 처음부터 켜놓고 밑에 코드가 길면 그만큼 들고 있는 시간이 너무 길기 떄문에 들고 있는 시간으로 인해 문제가 생길 수 있습니다.

2. transaction을 사용하는 동안 그 테이블들은 다른 transaction이 접근하지 못하기 때문에 기다려야하는 상황이 생기고 오래 기다리면 timeout 이 생길 수 있습니다.

 

const db = require('../../테이블 위치');

const transaction = await db.sequelize.transaction(); // transaction 시작

try{

   await db.table_name.create(createObject,{transaction}); // 생성 시 트랜잭션 적용
   
   // commit 되기 전 상태라 위에 create 한걸 찾을 수 없음
   await db.table_name.findOne();
   
   // transaction을 걸어둬서 같이 한 단위로 작업하기에 create한게 보임
   await db.table_name.findOne({transaction});

   await transaction.commit(); // 성공시 commit
} catch(error) {
	// 에러 시
    await tansaction.rollback(); // 실패 시 rollback
}

 

Transaction은 가능하면 딱 사용하는 부분에서 시작을 걸고 끝내는게 가장 좋습니다.

 

그리고 try, catch를 걸어둬서 오류가 생겼을때 무슨 문제인지 확인 할 수 있는게 오류 처리하기에 좋습니다.

728x90

'잡다한 지식' 카테고리의 다른 글

[JS] PHP로 다시 serialize하기 위해 만든 함수  (0) 2023.10.30
[JS] sequelize raw query 적용  (1) 2023.10.29
[JS] sequelize op 사용  (0) 2023.10.26
[JS] ioredis 라이브러리  (0) 2023.10.11
Sql 기본 문법 간단한 정리  (0) 2023.02.09