transaction
TRANSCRIPT
Transaction
트랜잭션이 뭔가요 ?
DB 에서 상호작용의 단위
ACID
Atomicity
Consistency
Isolation
Durability
Atomicity
다 실행하거나
아무것도 안하거나
유저가 포인트로
아이템을 삽니다
1. 포인트를 깎는다 .
2. 아이템을 지급한다 .
그런데 ..아이템을 생성하다
죽으면 ?
포인트만 나갔네… ?
포인트만 나갔네… ?
망했어 ?
안망했어 ?
Consistency
일관성
DB Constraints
PRIMARY KEYUNIQUE
FOREIGN KEY
ENUM
위반하는 트랜잭션은
OUT!
Isolation
혼자 있고 싶습니다 모두 나가 주세요
고립성 (Isolation)
다른 트랜잭션의 연산 작업이
끼어들지 못하도록 보장하는 것을
의미한다 .
Durability
한번 커밋된 내용은시스템 문제 ,
DB 일관성 체크 등무슨 짓을 해도
영원히 반영
뭐 알아서잘 만들었겠죠
Q.
왜 대충 DB ACID 검색하면 나오는 뻔한 얘기를 하고
있나요 ?
우리중 스파이가 있는 것 같아
Isolation
BEGIN TRANSACTION
BEGIN TRANS-ACTION
BEGIN TRANS-ACTION
BEGIN TRANS-ACTION
BEGIN TRANS-ACTION
다른 트랜잭션의 연산 작업이
끼어들지 못하도록 보장하는 것을
의미한다 .
BEGIN TRANS-ACTION
BEGIN TRANS-ACTION????????
먼저 시작한 놈이
뭘 하려는 거지 ?
BEGIN TRANS-ACTION
BEGIN TRANS-ACTION????????
먼저 시작한 놈이
뭘 하려는 거지 ?
BEGIN TRANS-ACTION
BEGIN TRANS-ACTION
SELECT * WHERE id=1
이러면 망하는데 ?
INSERTid=1
BEGIN TRANS-ACTION
BEGIN TRANS-ACTION????????
BEGIN TRANS-ACTION
BEGIN TRANS-ACTION
SLEEP(10000)
타협
타협 Level
Isolation Level
Serializable
내가 건드린건보지 마
Read-Write Lock
SELECT ageFROM usersWHERE id=1
T1 T2 DB
1, 20
UPDATE usersSET age=21where id=1SELECT age
FROM usersWHERE id=1
SELECT ageFROM usersWHERE id=1
T1 T2 DB
1, 20
1
UPDATE usersSET age=21where id=1SELECT age
FROM usersWHERE id=1
SELECT ageFROM usersWHERE id=1
T1 T2 DB
1, 20
120
UPDATE usersSET age=21where id=1SELECT age
FROM usersWHERE id=1
SELECT ageFROM usersWHERE id=1
T1 T2
UPDATE usersSET age=21where id=1
DB
1, 20
1 Locked!
20
SELECT ageFROM usersWHERE id=1
SELECT ageFROM usersWHERE id=1
T1 T2 DB
1, 20
1
2
20
20
Locked!
UPDATE usersSET age=21where id=1SELECT age
FROM usersWHERE id=1
SELECT ageFROM usersWHERE id=1
T1 T2 DB
1, 20
1Locked
!
Re-lease!
2
20
20
UPDATE usersSET age=21where id=1SELECT age
FROM usersWHERE id=1
SELECT ageFROM usersWHERE id=1
T1 T2
UPDATE usersSET age=21where id=1
DB
1, 21
1
Re-lease!
2
3
20
20
SELECT ageFROM usersWHERE id=1
기다리기 싫어요 !
MORE 타협
REPEATABLE READ
첫인상
첫 READ
첫 READ 가트랜잭션 내내
유지
SELECT ageFROM usersWHERE id=1
T1 T2 DB
1, 20
120
UPDATE usersSET age=21where id=1SELECT age
FROM usersWHERE id=1
SELECT ageFROM usersWHERE id=1
T1 T2 DB
1, 20
120
UPDATE usersSET age=21where id=1
T1 Snapshot1, 20
SELECT ageFROM usersWHERE id=1
SELECT ageFROM usersWHERE id=1
T1 T2 DB
1, 21
120
UPDATE usersSET age=21where id=1
2T1 Snapshot
1, 20
SELECT ageFROM usersWHERE id=1
SELECT ageFROM usersWHERE id=1
T1 T2 DB
1, 21
120
UPDATE usersSET age=21where id=1
T1 Snapshot1, 20 2
어 스냅샷
이 20 이네 ?
3SELECT ageFROM usersWHERE id=1
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 21
120
UPDATE usersSET age=21where id=1
T1 Snapshot1, 20 2
그럼 20디비가 뭐라든…
20 3
그 시점에 커밋된걸
보고 싶어요 !
READ COMMIT-TED
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 20
120
UPDATE usersSET age=21where id=1
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 20
120
UPDATE usersSET age=21where id=1
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 21
120
UPDATE usersSET age=21where id=1
2
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 21
120
UPDATE usersSET age=21where id=1
2
어 21 이네 ?
3
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 21
120
UPDATE usersSET age=21where id=1
2
21 3
ACID 필요없어 !그냥 졸라 빠르게 !
READ UNCOMMIT-TED
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 21
120
UPDATE usersSET age=21where id=1
2
21 3
사실 뭔가 생략되어있어요
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 21
120
UPDATE usersSET age=21where id=1
COMMIT
2
21 3
커밋을 안하고롤백하면 ?
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 20
UPDATE usersSET age=21where id=1
ROLLBACK
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 20
120
UPDATE usersSET age=21where id=1
ROLLBACK
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 20
120
UPDATE usersSET age=21where id=1
ROLLBACK
2
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 20
120
UPDATE usersSET age=21where id=1
2
ROLLBACK
어 우리 커밋 안했는데 기다려야하는거 아니에요 ?
몰라 대충 넣어
SELECT ageFROM usersWHERE id=1
T1 T2 DB
1, 21
120
UPDATE usersSET age=21where id=1
ROLLBACK
2
SELECT ageFROM usersWHERE id=1
21 3
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 21
120
UPDATE usersSET age=21where id=1
2
21 3
ROLLBACK4
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 20
120
UPDATE usersSET age=21where id=1
2
21 3
ROLLBACK4롤백롤백
SELECT ageFROM usersWHERE id=1
T1 T2
SELECT ageFROM usersWHERE id=1
DB
1, 20
120
UPDATE usersSET age=21where id=1
2
21 3
ROLLBACK4롤백롤백
????????
Q: 이럴거면 뭐하러
트랜잭션을 쓰죠 ?
A: 몰라요
권장하지 않아요 .
MySQL Default
REPEATABLE READ
Postgres Default
READ COMMITTED
짜잘짜잘하게 다른데
그런건 알아서 !
하고싶은 말
트랜잭션은생각보다 만능이
아닙니다…
Execution Order를 보장해주지 않아요 .
끗