
ExpressJS Sequelize transaction
데이터베이스 상태를 변화시키기 위해 수행하는 작업 또는 한 번에 실행되어야 할 연산
이미 MySQL 사용법을 포스팅했었지만 ORM에서의 사용법을 기록하지 않아 작성한다. 트랜잭션을 설명할 경우 단골 예로 등장하는 예시가 있다. A와 B가 있다. A의 통장에서 B의 통장으로 돈을 송금한다. 송금 과정에서 A의 통장에서 출금은 되었지만 알 수 없는 오류로 B의 통장에 입금 처리가 되지 않았다. 이 예시로 쉽게 이해했었다. 데이터베이스의 상태를 변환시키는 쿼리이므로 즉 여러 개의 쿼리를 한 단위로 묶는다. MySQL은 방법이 하나지만 Sequelize transaction은 2가지 방법을 지원한다.




User와 유저의 세부 정보를 담고 있는 Info 모델이 있다. 유저의 정보가 2개의 모델로 나눠져있다. User.create 함수가 성공적으로 종료 후 다음으로 넘어가는 과정에 에러가 발생하여 Info.create가 실행되지 않은 채 next(err)이 호출되었다고 가정해 보자 결국 User 모델의 정보만 저장되었고 세부 정보 테이블에는 어떠한 데이터도 생성되지 않았으므로 결국 새로 생성된 User 모델의 데이터는 사용할 수가 없다.
1. Unmanaged Transactions
MySQL과 사용 방법이 동일하다. 사용자가 직접 commit과 rollback을 작성해야 한다.


sequelize의 transaction 메서드를 변수로 선언한다.
트랜잭션을 사용하고 싶은 쿼리에 2번째 인수로 키 transaction으로 넣고 값에 트랜잭션 메서드를 넣는다.
이 과정이 데이터베이스를 변화 시키기 위한 2개 이상의 쿼리를 하나의 단위로 묶는 작업이다.



코드 순서를 보면 User.create 함수 종료 후 throw 에러가 발생했지만 데이터베이스에 저장되지 않았다.
쿼리 실행 중 에러가 발생해 commit까지 도달하지 않는다면 해당 쿼리들은 전부 반영되지 않는다.
실행 중 발생한 에러는 try/catch 중 catch로 가 t.rollback이 실행되어 처음 상태로 돌아간다.
2. Managed Transactions
Sequelize에서 제공하는 2번째 트랜잭션 사용 방법이다.
사용자가 직접 commit/rollback을 작성하지 않는다.



1번이랑 다르게 commit/rollback을 작성하지 않는다.
쿼리 실행 중 에러가 없다면 함수 종료 후 자동으로 commit을 실행하고 에러가 발생하면 catch로 간다.
tips
1. transaction 사용 시 try/catch 블록을 정확히 구분한다.
2. 코드가 복잡할 경우 어떤 위치에서 commit/rollback이 발생하는지 구분하기 위해 Unmanaged를 많이 사용한다.
'서버 > Express' 카테고리의 다른 글
ExpressJS moment (0) | 2022.06.20 |
---|---|
ExpressJS CSRF (0) | 2022.06.19 |
ExpressJS MySQL CRUD (0) | 2022.05.14 |
ExpressJS CORS(Cross-Origin-Resource-Sharing) (0) | 2022.03.28 |
ExpressJS JWT (0) | 2022.03.26 |