uju's Tech

[Node.js:Sequelize] Transaction 사용 시 주의할 점 본문

Node

[Node.js:Sequelize] Transaction 사용 시 주의할 점

ujusy 2021. 7. 13. 01:50

<본 포스팅은 공부 목적으로 작성되었습니다. 혹시 틀린 부분이 있거나 문제가 되는 부분이 있다면 답글 달아주세요!>

 

데이터베이스의 여러 테이블의 정보를 반영시킬 때 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에 대한 연산을 해주지 않아 발생 할 수 있는 문제이다.

Comments