일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 파이썬
- 회고
- spring Batch
- 사이버보안
- 보안
- Python
- 백준
- 포너블
- 웹해킹
- 웹보안
- gcp
- cloud run
- gcp ci/cd
- kotest
- docker
- gcp cloud build
- 프로그래머스
- Batch
- programmers
- node.js
- sequelize
- webhacking.kr
- hackctf
- 스프링 배치
- nodejs
- 리버싱
- pwnable.xyz
- 시스템 해킹
- 네트워크
- Baekjoon
Archives
uju's Tech
[Node.js:Sequelize] Transaction 사용 시 주의할 점 본문
<본 포스팅은 공부 목적으로 작성되었습니다. 혹시 틀린 부분이 있거나 문제가 되는 부분이 있다면 답글 달아주세요!>
데이터베이스의 여러 테이블의 정보를 반영시킬 때 transaction 을 걸지 않고 구현하게 되면 정상적으로 반영이 이루어지지 않는다.
여러 테이블의 정보를 변경할 때 아래와 같이 transaction을 선언해주고 transaction을 걸어준다.
const transaction = await db.sequelize.transaction();
그 후 커밋을 하고 에러가 발생할 경우 롤백을 진행해준다.
{
await User.create(data, transaction);
...
await transaction.commit();
} catch (err) {
await transaction?.rollback();
}
가끔 위에서 transaction을 선언하고 커밋 전에 다른 에러가 발생하여 throw 될 경우 transaction이 생성되어 활동 상태에 멈춰있게 된다.
그렇게 되면 롤백과 커밋이 되지 않은 상태로 db를 잡고 있어 test 가 정상적으로 작동하지 않는 것을 확인할 수 있다.
사용하게 되면 transaction을 사용 전 선언하고 사용할 때마다 try-catch 문을 사용해 rollback을 해주는 것이 바람직한 것 같다.
문제가 된 상황은 아래와 같다.
const transaction = await db.sequelize.transaction();
....
...
throw error;
{
await User.create(data, transaction);
...
await transaction.commit();
} catch (err) {
await transaction?.rollback();
}
transaction 은 위에서 활동 상태가 되었는데 부분 완료나 실패의 상황없이 error가 throw 되어 transaction에 대한 연산을 해주지 않아 발생 할 수 있는 문제이다.
'Node' 카테고리의 다른 글
[Sequelize: 기록용]sequelize migration 시 ERROR: Cannot read property 'toString' of undefined 에러 (0) | 2021.07.30 |
---|---|
[Node:기록용] Date 를 '월-일-요일' 포맷팅 (0) | 2021.07.16 |
[Node.js] Apple sign in 연동 취소 시 Server Notification (0) | 2021.07.12 |
[Node.js : Sequelize] join 이 2번 필요할 때 (0) | 2021.05.28 |
[Node.js] 소셜로그인 정복하기 - google (2) | 2021.05.27 |
Comments