본문 바로가기
개발 Study/Node

[Sequelize/Node.js] commit has been called on this transaction 에러 해결

by jiyoon_92 2023. 1. 31.
반응형

'commit has been called on this transaction' 에러 해결

 

1. Error 메시지

에러 메시지

단순히 Flag 값 하나를 업데이트 시켜서 저장하는 함수를 만들었는데 다음과 같이 에러가 났다. Sequelize의 비동기 transaction을 이용하여 업데이트 및 저장 하는 함수인데 뭐가 잘못된건지 찾느라 헤맸다.

반응형

2. 해결 방법

아래와 같이 두 코드를 비교해보면 id로 공고 정보를 찾아 del_status라는 flag 값을 변경 후, save()함수를 이용하여 저장해야하는데 await 을 추가해야 순차적으로 실행되므로 다음과 같이 수정했다.

//문제 코드
const deleteRecruit = async (recruit_id : number) => {
  const result = await ORM.getInstance().transaction(async (t) => {
    try {
      const recruit = await Recruit.findOne({where: {recruit_id : recruit_id}, transaction : t});
      if (!recruit)
        return null;
      recruit.del_status = true;
      recruit.save({transaction : t});
      return true;
    } catch (error) {
      console.log(error);
      return null;
    }
  });
  if (result != null) {
    return {res : true, msg : `Delete Recruit.`};
  } else {
    return {res : false, msg : `Failed to delete recruit.`};
  }
}

//해결 코드
const deleteRecruit = async (recruit_id : number) => {
  const result = await ORM.getInstance().transaction(async (t) => {
    try {
      const recruit = await Recruit.findOne({where: {recruit_id : recruit_id}, transaction : t});
      if (!recruit)
        return null;
      recruit.del_status = true;
      //비동기 추가
      await recruit.save({transaction : t});
      return true;
    } catch (error) {
      console.log(error);
      return null;
    }
  });
  if (result != null) {
    return {res : true, msg : `Delete Recruit.`};
  } else {
    return {res : false, msg : `Failed to delete recruit.`};
  }
}

 

반응형

댓글