[24.01.18] Today CS 공부 [트랜잭션]

Seong Hyeon Kim·2024년 1월 18일
0

CS스터디

목록 보기
9/9

트랜잭션

정의

정의 : 트랜잭션은 데이터베이스 시스템에서 수행되는 작업의 논리적인 단위입니다. 트랜잭션은 하나 이상의 데이터베이스 조작(예: 삽입, 갱신, 삭제)을 포함하며, 이러한 조작들은 모두 성공하거나 모두 실패해야 합니다. 트랜잭션은 데이터베이스의 일관성을 유지하기 위한 중요한 개념이며, ACID 속성을 가지고 있습니다.

ACID는 트랜잭션이 안전하게 수행되기 위한 네 가지 속성을 나타냅니다

  1. 원자성(Atomicity):
    트랜잭션의 모든 조작은 원자적으로 실행되어야 합니다. 즉, 모든 조작은 성공적으로 완료되거나 어떠한 조작도 수행되지 않은 것처럼 롤백되어야 합니다. 어느 하나라도 실패하면 트랜잭션 전체가 실패해야 합니다.

  2. 일관성(Consistency):
    트랜잭션이 완료된 후에는 데이터베이스가 일관된 상태로 유지되어야 합니다. 트랜잭션이 일부만 적용되어 데이터베이스가 불일치한 상태로 남아서는 안 됩니다.


  1. 고립성(Isolation):
    여러 트랜잭션이 동시에 실행될 때 각 트랜잭션은 다른 트랜잭션에 영향을 미치지 않도록 고립되어야 합니다. 다시 말해, 어떤 트랜잭션이 진행 중일 때, 다른 트랜잭션에서는 그 결과를 참조할 수 없어야 합니다.

  1. 지속성(Durability):
    트랜잭션이 성공적으로 완료된 경우, 그 결과는 영구적으로 유지되어야 합니다. 시스템이 장애가 발생해도 트랜잭션의 결과는 보존되어야 합니다.

예시코드

const mysql = require('mysql');

// MySQL 연결 정보
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'your_username',
  password: 'your_password',
  database: 'your_database',
});

// 연결
connection.connect((err) => {
  if (err) {
    console.error('Error connecting to MySQL:', err);
    return;
  }
  console.log('Connected to MySQL');
});

// 트랜잭션 시작
connection.beginTransaction((err) => {
  if (err) throw err;

  // 예시: 두 개의 SQL 쿼리를 실행
  const query1 = 'INSERT INTO users (username, email) VALUES (?, ?)';
  const values1 = ['john_doe', 'john@example.com'];

  const query2 = 'UPDATE products SET stock = stock - 1 WHERE product_id = ?';
  const values2 = [123];

  // 첫 번째 쿼리 실행
  connection.query(query1, values1, (error, results1) => {
    if (error) {
      return connection.rollback(() => {
        throw error;
      });
    }

    // 두 번째 쿼리 실행
    connection.query(query2, values2, (err, results2) => {
      if (err) {
        return connection.rollback(() => {
          throw err;
        });
      }

      // 트랜잭션 커밋
      connection.commit((commitErr) => {
        if (commitErr) {
          return connection.rollback(() => {
            throw commitErr;
          });
        }

        console.log('Transaction Complete.');
        connection.end(); // 연결 종료
      });
    });
  });
});

chat gpt를 통해 빠르게 예시코드를 얻었고 확인해보았다.

기존에 사용하던 방법과 차이가 있다면 단순 쿼리만을 실행시키는것이 아닌 시작을 connection.beginTransaction((err) => 함수로 실행함으로서 트랜잭션이라는 한개의 단계를 더 만들어준 걸로 이해했다.

그래서 이 코드에서는 beginTransaction, commit, rollback 메서드를 사용하여 트랜잭션을 시작, 성공적으로 완료, 실패할 경우 롤백하는 과정을 보여주고 있다.

앞선 설명에서 자세하게 나왔든 결국 트랜잭션이라는 것은 하나의 작업단위 라는 게 핵심이다.



그래서 결국 트랜잭션은?

db에 쿼리를 날리기전 하나의 단계를 더 거치기 때문에 안전성이 돋보이는 기능인 것 같다.

일반적으로는 그냥 쿼리만 날려도 큰 무리가 없다라고 하면 오히려 번거로울 수 있지만, 우리가 깃헙을 사용해서 코드를 이전으로 되돌리듯이 쿼리도 상황에따라서 이것을 실행을 중지해야하거나 되돌려야 되는 상황들이 분명히 있을 것이고,


이것을 사람이 판단하는게 아니라 트랜잭션이라는 하나의 과정을 더 만듬으로써 크로스 체크가 되는 일련의 작업이라고 볼 수 있을 것 같다.


  • 내가 생각한 예시
    물론 그러면 안되지만 내가 만약 결제시스템을 만든다고 가정할때 결제용 쿼리를 실행하고 이후에 그사람의 주소를 찾아서 배송지를 만드는 하나의 로직이 있다고 가정했을때, 만약 그사람이 결제는 했는데 주소가 없거나, 혹은 주소가 작성은 되었었는데 에러핸들링 과정에서 발견못한 오류로 쿼리가 실행되지 못하는 상황일때 결제 쿼리는 이미 실행되버려서 결국 돈만 낸 상황이 발생한다.

하지만 트랜잭션으로 결제쿼리 실행 => 대기 => 주소확인쿼리 실행 => 오류 => 하나라도 오류라서 롤백

이러한 순서로 진행이 되면 실행한걸 되돌린다기보다는 실행을 멈춰놓고 보류하는 상황이기 때문에 그냥 롤백할 수 있고 충분히 안정적으로 사용할 수 있을것 같다.





트랜잭션이 사용될간단한 상황을 Gpt로 찾아본 예시


은행 거래:

-고 객이 계좌이체를 요청하는 경우, 출금과 입금 두 개의 데이터 조작이 필요합니다. 트랜잭션을 사용하면 이 두 조작을 하나의 단위로 처리하여 어느 하나라도 실패하면 전체 트랜잭션을 롤백할 수 있습니다. 이를 통해 잔액 부정확이나 중간에 거래가 실패하는 등의 문제를 방지할 수 있습니다.

예약 시스템:

  • 호텔 예약 시스템에서 예약과 결제는 두 개의 연관된 데이터 조작입니다. 사용자가 예약을 완료하면 해당 예약에 대한 결제도 동시에 이루어져야 합니다. 트랜잭션을 사용하면 예약과 결제가 원자적으로 처리되어 어느 하나라도 실패하면 전체 과정을 롤백할 수 있습니다.

주문 처리:

  • 온라인 쇼핑몰에서 주문 처리 시 주문 정보와 결제 정보 간에 일관성이 유지되어야 합니다. 주문이 완료되면 결제도 동시에 이루어져야 하며, 두 가지 조작이 모두 성공해야 주문이 최종적으로 확정됩니다. 트랜잭션을 사용하면 주문과 결제가 원자적으로 수행되어 데이터의 일관성을 보장할 수 있습니다.

글 작성 및 파일 업로드:

  • 블로그나 컨텐츠 관리 시스템에서 글 작성 시 글 데이터의 삽입과 동시에 첨부 파일의 업로드가 필요할 수 있습니다. 트랜잭션을 사용하면 글 삽입과 파일 업로드가 원자적으로 처리되어, 어느 하나라도 실패하면 전체 작업을 롤백하여 일관성을 유지할 수 있습니다.

회원 가입 및 프로필 생성:

  • 새로운 사용자가 회원 가입을 완료하면 동시에 사용자 프로필도 생성되어야 합니다. 이 두 작업이 함께 이루어지는 경우, 트랜잭션을 사용하여 회원 가입과 프로필 생성이 원자적으로 수행되어 무결성을 유지할 수 있습니다.

찾아보니 생각보다 트랜잭션의 사용유무가 단순 롤백의 역활도 있겠지만 원자적으로 수행하는 관점에서 많이 사용이 된다는 것도 알게 되었다

profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 백엔드 개발자

0개의 댓글