오늘도 개발

트랜잭션(Transaction) 본문

웹 프로그래밍/DB

트랜잭션(Transaction)

Sueeeeeee 2022. 6. 28. 10:32

1. 트랜잭션(Transaction)이란?

트랜잭션은 데이터베이스 상태 변경을 위해 필요한 명령문의 묶음이라고 생각하면 된다.

트랜잭션은 작업의 최소 단위이기 때문에 묶인 명령 중 하나라도 실패하면 아무 작업도 결과에 반영하지 않는다.

개발자는 SQL 쿼리(SELECT, INSERT, DELETE, UPDATE)를 하나 이상 조합하여 트랜잭션을 만들 수 있다.

 

예를 들어 계좌 이체를 위한 트랜잭션은 다음과 같이 구성할 수 있다.

 

1) 한 계좌에서 돈을 출금한다.

2) 다른 계좌에 돈을 입금한다. 

 

출금은 성공했는데 입금에 실패하면 트랜잭션 전체가 취소되며 출금도 취소된다.

만약 1번만 트랜잭션이었다면 출금은 되었는데 입금이 되지 않는 문제가 발생할 수 있다.

이렇게 데이터베이스를 다룰 때는 트랜잭션을 잘 설계할 필요가 있다.

2.  Commit, Rollback 연산

Commit 

트랜잭션 성공 시 수행하는 연산.

수행한 트랜잭션을 로그에 저장한다.

(mysql은 autocommit이 디폴트. 끄려면 set autocommit = 0 실행)

 

Rollback

트랜잭션 실패 시 수행하는 연산.

부분적으로 성공한 연산이 있으면 취소하고

처음부터 다시 트랜잭션을 수행한다.

commit 되기 전에만 rollback이 가능하다.

2. 트랜잭션 설계와 ACID

트랜잭션을 설계할 때는 ACID를 지켜야 한다.

ACID는 트랜잭션의 안전성을 보장하는 성질이다. 

 

  • 원자성(Atomicity)
  • 일관성(Consistency)
  • 독립성(Isolation)
  • 지속성(Durability)

1) 원자성(Atomicity)

한 트랜잭션의 연산은 모두 성공하거나 모두 실패할 수만 있다.

하나라도 실패한 연산이 있으면 트랜잭션 자체도 실패로 처리된다.

(위의 입출금 예시)

2) 일관성(Consistency)

트랜잭션 전에 유효했던 데이터베이스는

트랜잭션 후에도 일관되게 유효해야 한다.

 

예를 들어 모든 유저는 아이디를 가져야 하는 규칙을 갖는 데이터베이스가 있다.

여기서 아이디 없는 유저를 추가할 수 있는 트랜잭션을 만들면

해당 데이터베이스는 트랜잭션 이후 유효하지 않은 데이터베이스가 된다. (= 일관성을 잃는다.)

3) 독립성(Isolation)

각 트랜잭션은 다른 트랜잭션과 독립적으로 존재해야 한다.

한 트랜잭션은 다른 트랜잭션의 내용을 알 수 없으며

여러 트랜잭션을 동시에 수행하면 트랜잭션을 연속으로 실행한 것과 같은 결과가 나와야 한다.

 

다시 계좌 이체 트랜잭션을 생각해보자.

계좌 이체 트랜잭션은 1) 내 계좌에서 출금 2) 타 계좌에 입금으로 구성되어 있다.

이제 1번 계좌에 1000원을 보내는 동시에 2번 계좌에 1000원을 보낸다고 생각해보자.

 

이때 독립성을 지킨 트랜잭션은 다음과 같이 실행된다.

 

첫번째 트랜잭션 : 1) 내 계좌에서 1000원 출금, 2) 1번 계좌에 1000원 입금

두번째 트랜잭션 : 1) 내 계좌에서 1000원 출금, 2) 2번 계좌에 1000원 입금 

 

내 계좌에서 2000원이 나가야 한다고

1) 내 계좌에서 2000원 출금, 2) 1번 계좌에 입금, 3) 2번 계좌에 입금하는 식이면 오류가 날 수 있다.

(계좌에 1000원밖에 없는 경우 통장이 마이너스가 됨)

4) 지속성(Durability)

성공적으로 수행된 트랜잭션은 반드시 DB에 반영한다는 뜻이다.

예를 들어 MySQL은 트랜잭션 결과를 로그로 남겨 하드 디스크에 저장한다.

트랜잭션 완료 후 커밋하는 중 DB에 오류가 나더라도 로그가 있기 때문에 추후에 트랜잭션을 적용할 수 있다.

 

참고

트랜잭션(Transaction)이란?

트랜잭션의 ACID 성질

'웹 프로그래밍 > DB' 카테고리의 다른 글

LEFT JOIN 시 행 중복 문제 해결하기  (0) 2022.10.04
GROUP BY, 집계함수  (1) 2022.10.03
테이블 JOIN 방법(INNER JOIN, OUTER JOIN)  (0) 2022.10.02
관계형 데이터베이스(Relational Database)  (0) 2022.06.27
SQL 기초  (0) 2022.03.30