Web (웹), Server (서버)

[Server] DataBase Transaction / 데이터베이스 트랜잭션 / 사용법

Oscar:) 2024. 2. 7. 15:02

 

 

이번 포스팅에서는 데이터베이스 트랜잭션에 대해 알아본다.

 

 


 

트랜잭션이란?

 

 

'하나의 작업을 수행하기 위해 필요한 데이터베이스 연산을 모아놓은 것'

 

'DB의 상태를 변화시키기 위해 수행하는 작업 단위' 라고 정의하기도 한다.

 

 

요약하자면,

'DB의 상태를 변화시키는 여러 명령이 묶인 작업의 한 단위' 라고 할 수 있겠다.

 

 

 


 

트랜잭션의 특징

 

 

트랜잭션은 다음과 같은 4가지 특징을 가지고 있다.

 

 

✅ 원자성 (Atomicity)

 

트랜잭션이 DB에 '모두' 반영되거나, '전혀' 반영되지 않아야 한다.

 

3가지 작업을 한번에 수행했을 때, 2개는 성공하고 1개는 실패했다고 가정한다.

실패한 1개의 작업 때문에 성공한 2개의 작업을 'rollback' 하여 되돌려 놓아야 한다.

 

 

 

✅ 일관성 (Consistency)

 

작업 처리 결과는 항상 일관성 있어야 한다.

 

- 명시적 조건 : 트랜잭션 수행 후 column과 제약 조건 등이 변경되어서는 안 된다.

- 비명시적 조건 : A → B 계좌 이체 시, 두 계좌 잔고의 합은 전·후가 항상 같아야 한다.

 

 

 

✅ 독립성 (Isolation)

 

둘 이상의 트랜잭션이 병행되고 있다면, 서로 다른 트랜잭션에 끼어들어선 안 된다.

 

'commit'과 'rollback'의 안정성에 있어 서로 다른 트랜잭션에 영향을 주는 작업은 치명적이다.

 

여러 트랜잭션이 필연적일 때, 가장 쉬운 해결 방법은 순차적으로 수행하는 것이다.

 

 

 

✅ 지속성 (Durability)

 

트랜잭션이 성공적으로 완료되었다면, 결과는 영구 반영되어야 한다.

 

작업 후 데이터는 향후 어떠한 장애가 발생하더라도 영구 보존되어야 한다.

 

 

 


 

MySQL에서 트랜잭션 사용해보기

 

 

위에서 설명한 트랜잭션의 특징 중

'원자성'을 기반으로 직접 사용해보자.

 

 

✅ 트랜잭션 기능 활성화 확인

 

MySQL은 InnoDB 엔진을 default 엔진으로 채택하고 있다.

 

다음 명령어를 입력하여 트랜잭션 기능을 확인해보자.

 

show engines;

 

 

아마 위와 같이 세팅되어 있을 것이다.

 

 


 

✅ autocommit 기능 활성화 확인

 

MySQL에서는 autocommit 기능이 기본 값으로 세팅되어 있다.

 

*autocommit : 세미콜론을 한 번 찍을 때마다 자동으로 commit이 되는 시스템

 

 

다음 명령어를 입력하여 autocommit 여부를 확인해보자.

 

show variables like '%commit%';

 

 

 

트랜잭션을 사용하기 위해서는 위 autocommit을 사용하면 안 된다.

 

하지만 트랜잭션 시작 명령어를 입력하면 자동으로 해제되기 때문에,

별도로 해제해주지 않아도 된다.

 

 


 

✅ 기본적인 트랜잭션 사용법

 

 

● 트랜잭션 시작 & 커밋

 

start transaction;

// 쿼리문 1 실행

// 쿼리문 2 실행

commit;

 

트랜잭션을 시작하고, 필요한 작업 후 커밋하는 방식이다.

 

커밋을 하기 전에는 임시 저장과 같은 느낌으로 실행되고,

커밋을 해야 저장이 된다.

 

 


 

 

● 롤백 사용

 

start transaction;

// 쿼리문 실행

rollback;

// 쿼리문 롤백됨

 

커밋을 하기 전, rollback을 사용하면 이전까지 적용했던 쿼리문이 되돌려진다.

 

스크린샷을 보며 확인해보자.

 

 

 

① 트랜잭션 시작 전, user 테이블의 정보를 읽어왔다.

5개의 column이 존재한다.

 

② 트랜잭션을 시작해준다.

 

③ 5번 째 column을 삭제했다.

 

④ 삭제 후 user 테이블의 정보를 읽어서

해당 column이 임시 삭제된 것을 확인했다.

 

⑤ 트랜잭션을 rollback 한다.

 

⑥ 롤백 후 다시 user 테이블의 정보를 읽어왔다.

해당 column이 다시 되돌려진 것을 확인할 수 있다.

 

 


 

 

● 임시 저장 시점 관리

 

savepoint를 활용하여 임시 저장 시점을 관리할 수도 있다.

 

start transaction;

// 쿼리문 1 실행

savepoint A;

// 쿼리문 2 실행

rollback to A;

// 쿼리문 2 만 사라짐

 

마찬가지로 스크린샷을 보며 확인해보자.

 

 

① 트랜잭션을 시작해준다.

 

② 3번 째 column을 삭제했다.

 

③ A라는 식별자의 savepoint를 지정해준다.

 

④ 5번 째 column을 삭제했다.

 

⑤ A라는 savepoint 까지 rollback 했다.

 

⑥ 롤백 후 다시 user 테이블의 정보를 읽어왔다.

해당 savepoint 까지만 롤백된 것을 확인할 수 있다.

 

 


 

 

✅ DDL문은 트랙잭션의 대상이 될 수 없다.

 

*DDL문 : table 조작 & column 조작 SQL문

 

 

 


 

 

 

 

데이터베이스 트랜잭션에 대해 알아보았다.

 

사용하기에 따라 유용할 것 같다고 생각한다.