오래 못 할 짓 하지 않기
[ 데이터베이스 ] 13. Transaction / ACID 본문
도입 예제
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에 남아있다.
- 영구적으로 저장 = 비휘발성 메모리에 저장
(출처)
유튜브 쉬운코드
'3학년 1학기 > 데이터베이스(DB)' 카테고리의 다른 글
[ 데이터베이스 ] 15. Concurrency control(2) - recoverability (0) | 2024.01.13 |
---|---|
[ 데이터베이스 ] 14. Concurrency control (0) | 2024.01.12 |
[ 데이터베이스 ] 12. Trigger (0) | 2024.01.09 |
[ 데이터베이스 ] 11. Stored procedure 를 쓰기 힘든 이유 (0) | 2024.01.05 |
[ 데이터베이스 ] 10. Stored procedure (0) | 2024.01.04 |