Día de Ruru
20230406 TIL 본문
이제부터 본격적으로 파이널 프로젝트 개발이 시작되었다!!! 잘..할수있겠지..???
문제점
우리 프로젝트는 회사를 대상으로 한 b2b 프로젝트이다보니 회사가 가입하는 부분이 필요하다. 회사가 가입할 때 ceoId를 입력하게되는데 ceoId를 user 테이블에도 입력해주기 위해서 하나의 API에 create 명령어가 두개가 들어가게 되었다. 그런데 이게 차례대로 진행되다보니 뒷쪽에서 에러가 생겨도 전 단게에서 진행되었던 create 명령어는 다 실행이 되어버린다..!!
해결방안
try {
const { 받아올 내용 } = req.body;
const t = await sequelize.transaction({
isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED, // 트랜잭션 격리 수준을 설정합니다.
});
await Companys.create({
// 생성할 내용
},{ transaction: t })
await Users.create({
// 생성할 내용
},{ transaction: t })
await t.commit();
return res.status(200).json({ message: "회원가입에 성공하였습니다." })
} catch (err) {
await t.rollback();
next(err)
}
문제를 확인하자마자 바로 들었던 생각은 트랜젝션을 사용하면 되겠다!! 였다~~ 드디어 트랜젝션을 여기서 써보는 구나~~ 하면서 원하는 명령어마다 위의 코드처럼 트렌젝션을 적용해주었는데... 트렌젝션이 적용되지 않는 것 같았다.. 정확히는 rollback이 되고 있지 않았다
const t = await sequelize.transaction({
isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED, // 트랜잭션 격리 수준을 설정합니다.
});
try {
const { 받아올 내용 } = req.body;
await Companys.create({
// 생성할 내용
},{ transaction: t })
await Users.create({
// 생성할 내용
},{ transaction: t })
await t.commit();
return res.status(200).json({ message: "회원가입에 성공하였습니다." })
} catch (err) {
await t.rollback();
next(err)
}
문제를 검색해본 결과 try - catch 문에서 트렌젝션을 사용해줄 때 트렌젝션의 정의가 try 구문안에 들어가 있어서 catch 구문에서 사용할 수 없어진게 원인이었다!! 위 처럼 적용해주었더니 catch 구문에서도 t 를 사용할 수 있게 되어서 트렌젝션이 잘 적용되었다!!!
알게된 점
맨날 실수하는 호이스팅 문제.... 도대체 언제쯤 호이스팅 문제를 겪지 않게 되는가...........................
'항해99 > TIL' 카테고리의 다른 글
20230411 TIL (0) | 2023.04.12 |
---|---|
20230410 TIL (0) | 2023.04.11 |
20230405 TIL (0) | 2023.04.06 |
20230328 TIL (0) | 2023.03.29 |
20230325 TIL (0) | 2023.03.25 |
Comments