YS's develop story

트랜잭션의 의미 및 Node MySQL Transactions 적용해보기 본문

Database

트랜잭션의 의미 및 Node MySQL Transactions 적용해보기

Yusang 2021. 4. 10. 09:48

트랜잭션의 의미 및 Node MySQL Transactions 적용해보기

 

3학년 전공 필수과목 데이터베이스..

매우 중요한 개념인 Transactions에 대해 알아봅시다

 

 

 

transaction은 여러 개의 연속된 쿼리로 구성되어 있는데 하나의 작업처럼 작동해야 합니다.

 

 

SQL standard는 SQL 문이 실행될 때 트랜잭션이 암시적으로 시작되도록 지정해줍니다.

 

 

트랜잭션은 아래의 요소 중 하나의 상태로 끝나야 합니다.

 

  Commit work

  트랜잭션이 시작부터 끝날 때 때까지 수행되었던 모든 쿼리문들의 작업을

  데이터베이스에 영구적으로 업데이트하는 것

 

  Rollback work

  트랜잭션이 시작부터 끝날 때까지 수행되었던 작업들을 모두 취소하는 것

 

트랜잭션의 원자성

완전히 실행되거나 (Commit)

발생하지 않은 것처럼 롤백 (Rollback)되어야 합니다. (이를 원자성, Atomic이라고 합니다.)

 

 

트랜잭션은 계좌 이체나 상품 구매 등등 여러 개의 데이터베이스 연산을 하나로 처리해야 할 때 필수적으로 사용됩니다.

상품 구매를 예를 들어본다면...

 

A라는 사람이 가지고 있는 포인트를 이용해서 물건을 구입했습니다.

DB에서 A라는 사람의 포인트 중 물건 값만큼 포인트가 차감되고

DB에 A라는 사람이 물건을 샀다는 정보를 업데이트해주어야 할 것입니다.

이 두 가지 작업은 다른 작업이지만 무조건 하나의 작업처럼 이루어져야 합니다.

 

포인트가 차감되는 쿼리가 실행되고 시스템 에러로 인해서

물건을 샀다는 정보를 업데이트를 해주는 쿼리를 실행하지 못하는 에러가 발생한다면 큰 문제가 발생할 수 있겠죠.

 

그래서 트랜잭션을 통해서 모든 쿼리가 성공적으로 실행된다면 Commit을 하고,

하나라도 실패한다면 실행했던 모든 쿼리들을 실행한 적이 없던 것처럼 되돌리는 Rollback을 하게 됩니다.

 

Node MySQL Transactions 적용해보기

테스트를 위해 간단하게 코드를 작성하였고 상품정보를 저장하는 쿼리는 따로 만들지 않았습니다.

 

await conn.beginTransaction();

쿼리가 실행되기 전 트랜잭션 처리를 할 것임을 선언해 줍니다.

 

await conn.commit();

모든 쿼리가 성공적으로 실행된다면 위에서 본 글처럼 Commit work를 진행하게 됩니다.

 

 

await conn.rollback();

 

단 하나의 쿼리라도 에러가 발생하여 실패한다면 모든 쿼리가 실행이 된 적이 없던 것처럼 rollback

처리를 합니다.

 

 

//유저의 잔액 차감 트랜잭션
async function deductUserMoney(connection, deductUserMoneyParams) {
  const deductUserMoneyQuery = `

  UPDATE User SET userMoney = userMoney - ? WHERE userId = ?;

                  `;
  const [deductUserMoneyRows] = await connection.query(deductUserMoneyQuery,deductUserMoneyParams);
  return deductUserMoneyRows;
}
//유저의 잔액 확인 트랜잭션
async function checkUserMoney(connection, userId) {
  const checkUserMoneyQuery = `

  SELECT userMoney FROM User WHERE userId = ?

                  `;
  const [checkUserMoneyRows] = await connection.query(checkUserMoneyQuery,userId);
  return checkUserMoneyRows;
}

트랜잭션을 처리한 쿼리문들 (deductUserMoney, checkUserMoney)

 

 

 

Postman | The Collaboration Platform for API Development

Postman makes API development easy. Our platform offers the tools to simplify each step of the API building process and streamlines collaboration so you can create better APIs faster.

www.postman.com

Postman에서 테스트를 해보았고 성공적으로 잘 됩니다!

Comments