오래 못 할 짓 하지 않기

[ 데이터베이스 ] 13. Transaction / ACID 본문

3학년 1학기/데이터베이스(DB)

[ 데이터베이스 ] 13. Transaction / ACID

쫑알bot 2024. 1. 10. 13:52
728x90

도입 예제

J가 H에게 20만원을 이체했을 때, 각자의 계좌는 어떻게 변하는가?

 

 

 

은행 입장에서는 이 두 가지 SQL문이 정상적으로 실행되어야 함.

 

Transaction

둘 다 정상 처리되어야만 성공하는 단일 작업

 

● 단일한 논리적인 작업 단위

● 논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어 나눠질 수 없게 만든 것

일부만 성공하면 DB에 반영 X

 

Transaction 형태는

 

▶ Start Transaction;

▶ [' 실행하고 싶은 SQL문들 적기. ']

▶ COMMIT; // 지금까지 작업한 내용을 DB에 영구적으로 저장 + Transaction 종료

 

위 이체 관련 예제를 SQL에서 실행해보자

 

 

이런 뒤에

 

Start Transaction;

update account SET balance = balance - 20000 Where id ='J';

update account SET balance = balance + 20000 Where id ='H';

COMMIT;

 

근데 만약 보낸 금액이 잘못되었다면 어떻게 해야할까?

 

● ROLLBACK

: 지금까지 작업들을 모두 취소하고 Transaction 이전 상태로 돌린다.

 

 

● AUTOCOMMIT

- 각각의 SQL문을 자동으로 Transaction 처리 해주는 개념

- SQL문이 성공적으로 실행되면 자동으로 COMMIT

- SQL문이 성공적으로 실행X면 알아서 ROLLBACK

 

SELECT @@AUTOCOMMIT ;    // AUTOCOMMIT이 활성화 되어있는지 확인하는 쿼리문 

                                                     // 활성화 되어있으면 1, 아니면 0

insert into account values ('W',1000000);

AUTOCOMMIT이 활성화되어있을 때 위 명령문을 실행하면

이런 결과가 나온다.

 

여기에서

▶ SET autocommit=0;

▶ DELETE FROM account WHERE balance <=1000000;

를 실행하면

이런 결과가 남는다. 

하지만, autocommit을 끄고 delete를 했기에 rollback을 하면

             commit 내역에서 이전 상태로 돌아갈 수 있다.

             - commit 되지 않은 건 rollback이 안 된다.  

 

 

우리가 첫 예제에서 했던 것처럼 START TRANSACTION 을 실행하면 autocommit은 off된다.


일반적인 사용 패턴

 

1. Start transaction

2. SQL문들을 통해 로직 수행

3. SQL문들이 문제없이 실행되었다면 transaction을 commit한다.

4. 문제가 발생했으면 rollback을 한다.

 

 

자바에서 Transaction

- DB랑 연결하고

AUTOCOMMIT (false)로 설정하는 것 = Start Transaction

- 수행할 문장들 적기

    1) 성공 → Commit

    2) 실패 → Rollback

- AUTOCOMMIT(true)로 바꾸기 = 단일 SQL문이 들어와도 바로 Commit 되도록...

 

 

하지만 transaction 과 관련된 부가적은 부분들이 너무 많다 

ex) connection.## 들

 

Spring에서는 이러한 것들이 없어도 자동으로 처리가 된다.

단, 메소드 위에 @Transactional 이라는 어노테이션만 달아주면 된다.

 


로직만 짜면 된다.

 

 

ACID

: Transaction이 갖춰야할 4가지 규칙

 

Atomicity  

Conisistency

Isolation

Durability

 

 

● Atomicity (원자성)

All or nothing

▶ transaction은 더 이상 쪼개질 수 없는 단위이기 때문에, 내부에 SQL문들이 모두 성공해야한다.

    따라서, 중간에 하나만 실패해도 지금까지 작업을 취소하여 아무 일 없었던 것처럼 rollback 시킨다.

 

 

 

 

● Consistency (일관성)

J = 80만원

H = 220만원

 

이 때 J가 H에게 100만원을 송금한다고 해보자.

 

돈을 주고 받는 쿼리를 실행했을 때, 결과는

J = -20만원

H = 320만원

이다.

하지만 Table 를 만들 때 잔고는 0이하로 갈 수 없다고 Constraints 를 걸었다면

J가 -20만원으로 된다면 그 Update문은 Consistency를 깨기 때문에 해당 쿼리를 실행하지 않고

그 Transaction을 Rollback하는 것이다.

 

 

  • Transaction은 DB 상태를 [ Consistent → Consistent ] 로 바꿔야 한다.
  • Transaction이 Constraints, Trigger 등을 통해 DB에 정의된 rules 을 위반했다? ▶ ROLLBACK
  • Transaction이 DB의  rule을 위반했는지 DBMS가 Commit 전에 알려준다.

 

 

● Isolation 

J가 H에게 20만원을 보낼 때

H도 본인에게 30만원을 송금한다고 해보자

 

이렇게 순서가 꼬인다면 H가 본인에게 보낸 30만원은 업데이트가 되지않고,

가장 최근에 보낸 200만원 + 20만원만 보일 것이다.

 

  • 여러 Transation들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만든다.
  • DBMS는 여러 종류의 Isolation level을 제공한다
    (엄격하게 Isolation을 나눈다면 DB의 Performance가 줄어든다 → 필요한 정도의 Isolation만)
  • Concurrency control 의 주된 목표가 isolation이다.

 

 

● Durability(영존성)

Commit 한 Transaction은 DB에 영구적으로 저장된다. 

 

  • DB System에 문제가 생겨도 Commit된 transaction은 DB에 남아있다.
  • 영구적으로 저장 = 비휘발성 메모리에 저장

 

(출처)

유튜브 쉬운코드