트랜잭션이 뭐야?
트랜잭션은 sql이 적용될때
데이터를 잘 처리할 수 있도록 보장해주는 친구이다
예를 들어
윤철이가 채연이한테 10만원을 계좌 이체할때
윤철 100만원
채연 10만원이라면
update 윤철계좌 100만원 - 10만원
update 채연계좌 10만원 + 10만원
이 일어난다고 했을때, 순서대로 잘 처리될 수 있도록
단일하게 논리적으로 처리할 수 있는 작업 단위를
트랜잭션이라고 한다
Autocommit
그전에 autocommit 도 짚고 넘어가보자
원래 보통 dbms는 autocommit이 enabled 값이
default다
그래서 sql를 실행할때 기본적으로
commit이 발생한다.
근데 명시적으로 transaction start를 하게 된다면
autocommit은 false 상태가 된다
명시적으로 시작했던 트랜잭션의 commit이 일어나야
autocommit은 true 상태가 된다
결론적으로.. 트랜잭션은,,
내가 트랜잭션 걸고 싶은 로직에
트랜잭션 start를 하고,
로직을 수행하고
예외처리가 발생하면 rollback
잘 처리되면 commit 하는식의 코드개발이 필요하다
ACID
atomicity 원자성
윤철이가 채연이한테 돈을 주는 모든 일련의 과정들이
단일 트랜잭션 내에서 관리되어야한다.
그래야 윤철이 계좌에서 10만원이 마이너스되고
채연이 계좌에서 10만원이 플러스가 정상적으로 이루어지기 때문이다.
둘중 하나의 sql에서라도 정상적으로 진행되지 않는다면
윤철이의 계좌에서 10만원이 사라지지않았는데
채연이 계좌가 10만원이 늘어나거나,
윤철이 계좌가 10만원이 사라졌는데
채연이 계좌가 10만원이 늘어나지 않는 사태를 겪을 수 있다
원자성을 보장해서 한 트랜잭션 내에서 처리해줘야한다
Consistency 일관성
윤철이가 맘먹고 채연이한테 110만원을 계좌이체 해주고 싶을 수 있다
근데 윤철이는 100만원 밖에없다
그래서 update 윤철계좌 100만원 - 110만원이 실행될때
ddl 조건에 계좌잔액 >= 0 조건이 걸려있다면
일관적이지 못하기 때문에 오류가 발생한다
일관적일 수 있도록 보장해줘야한다
Isolation 고립성
가장 중요!! 한.. 트랜잭션 격리수준 관련 내용인데
윤철이가 채연이한테 10만원을 계좌이체 하는동시에
채연이가 본인 통장에 30만원을 넣으면 어떻게 될까?
10만원을 계좌이체 하는 트랜잭션A
30만원을 입금하는 트랜잭션B
각각이 발생될 것이다
근데
AB가 동시에 실행될때 채연이의 통장에 있는 금액을
맨처음 채연이의 통장에 있던 10만원을 읽어온다면
30만원만 입금되던가 10만원만 입금되던가 하는
사태가 발생할것이다
이처럼 여러 트랜잭션들이 동시에 실행될때
고립성을 보장해줘야한다 (마치 각각의 트랜잭션이 혼자고립되어 있는 것 처럼)
근데 이 격리수준을 높이면 높일수록 다른 트랜잭션에 영향을 일으키는게 적어지는게 보장되기는하나, 동시성이 떨어지기 때문에 dbms 퍼포먼스는 떨어진다
reapeatable read..? 이게 젤 만만도리인듯 커머스에선
Durabilty 영속성
트랜잭션에 의해 commit 되는건
영구적으로 값이 저장되어야 한다
끝!
격리수준쪽도 다시 공부해야겟다..
'CS 정리' 카테고리의 다른 글
| SQL에서 explain 사용해보기 (1) | 2024.06.27 |
|---|---|
| 모노레포, 멀티레포란? (1) | 2024.06.23 |
| aop란? (1) | 2024.05.30 |
| DI, IOC 란? (0) | 2024.05.27 |
| 트랜잭션이란? (0) | 2024.05.26 |