- 트랜잭션의 필요성은 어느 한 클라이언트만 서버에 접근하는 것이 아닌 여러 사람이 동시에 한 서버에 접근해서 발생하는 문제(데이터 부정합)로 인해 중요하다.
- 영화관 좌석 예약시 내가 J10번을 예약하고 결제를 하려는 그순간 누가 이미 그 자리를 결제해버렸다면?? 나는 다시 예약을 해야할 것이다. 하지만 트랜잭션이 적용되지 않았다면 두 사람 모두 J10을 예약해버리게 될 것이다.
- 이러한 사고를 방지하고 DB의 "유효성"을 높이기 위한 것이 바로 트랜잭션 개념의 핵심이다.
- 그렇다고 이러한 "꼬임"을 방지한다고 한번에 1명만 예약을 허용한다면?
- 100명이 한줄로 대기하여 예약을 해야한다는 것이니 너무나 비효율적이다.(즉 성능저하로 이어진다는 것)
- 따라서 트랜잭션에서는 실행할 질의(Query)들을 어떻게 관리할 것이지가 매우 중요하다.
- 트랜잭션을 제대로 수행하기 위해서 데이터베이스에서는 4가지 원칙을 준수해야만 한다.
1. 원자성(Atomicity)
2. 일관성(Consistency)
3. 격리성(Isolation)
4. 지속성(Durability)
- 원자성이 어떤 작업 혹은 작업들이 실행될 때 모두 실행 완료되고 이것이 모두 반영되어야 한다는 것을 의미한다. 만약 100% 완료가 아니라면 처음부터 없던 일이 되는 것이다.
- 하나의 트랜잭션에 속한 작업은 100%가 되어야만 그 결과를 실제 DB에 반영할 수 있다.
- All or Nothing
- 원자성을 위해서 현재 작업중인 트랜잭션의 내역은 유지하되, 이전에 commit된 상태를 임시 영역에 따로 저장하여 원자성을 보장한다.
- 만약 작업중인 트랜잭션에서 오류가 발생하면 이전 commit된 상태로 rollback하면 된다.
- 이전 commit된 데이터들이 있는 공간을 rollback segment라고 한다.
- 만약 오류가 난 지점 이전에 특정 부분까지는 잘 수행되어서 그 상태만이라도 저장을 하고 싶다면 중간 저장 지점 즉 savepoint를 지정할 수 있다.
- 일관성은 하나의 트랜잭션이 무사히 종료됬을 때, 개발자가 의도한 코드에 맞게 결과값이 나와야 한다는 것.
- 쉽게 말해 내가 아메리카노를 마시고자 삼성페이 A카드로 3000원을 결제했을 때 A에서 3000원이 빠져나가야지 B로 빠져나가면 안된다는 것이다.
- 트랜잭션의 일관성은 수행 전과 후의 **데이터 모델의 제약사항(기본키, 외래키, 도메인, 도메인 제약조건)**을 만족함으로써 보장할 수 있다.
- 서로 상하위 관계인 구기종목, 축구 테이블이 있다고 가정한다.
- 축구 테이블은 구기종목 테이블의 PK를 FK로 가족 있는데 만약 PK가 long -> double로 타입이 바뀐다면 당연히 FK로 double로 바뀌어야 한다.
- 이를 만족시켜주는 장치로 DBMS에서는 트리거(Trigger)를 사용한다.
- ※ 트리거란? DB에서 INSERT, DELETE, UPDATE같은 일명 DML(Data manipultion Language)가 수행될 때 트리거의 내용이 자동으로 동작하도록 설정한 프로그램을 말한다.
- 이 트리거의 기능을 통해 어떤 것이 수행되었을 때 반드시 수반되어야 하는 기능이 수행되도록 할 수 있다.
- 여러개의 트랜잭션을 실행하면 이것들이 한번에 실행되는 것이 아닌 각각 독립적으로 실행되어야 함을 의미한다.
- 즉 각 트랜잭션은 그 실행에 있어 서로에게 영향을 주어도, 받아도 안된다.
- CPU가 여러 작업(트랜잭션)을 동시에 수행한다는 것은 물리적으로 한 CPU가 여러 작업을 동시에 수행한다는 것이 아니다.
- CPU는 우리가 인식하지 못 할 정도로 빠르게 여러 작업들을 번갈아가며 수행한다.
- 이를 병렬처리(concurrent processing)라고 부른다.
- 병렬처리에서 문제가 될 수 있는 부분은 여러 작업들이 공통적으로 사용하는 데이터가 서로에 의해 변동된다는 점이다.
- 이는 우리가 원하는 값을 제대로 산출하는데 문제가 되기에 격리성을 보장할 수가 없어진다.
- 이를 예방하기 위해 Lock, Unlock의 개념을 도입할 수 있다.
- 공동으로 사용하는 데이터가 있을 때 한번에 한 트랜잭션만 해당 값을 가져다 사용할 수 있도록 제약을 거는 것이다.
- 즉 데이터를 읽고 쓰는 데는 제약을 걸고 그 작업이 끝나면 다른 트랜잭션이 그 데이터에 접근토록 허용하는 것.
- 물론 이때 너무나 많은 데이터들에 Lock이 걸려 트랜잭션이 아무것도 못하는 상태, 즉 데드락(Deadlock)에 빠지지 않도록 주의해야한다.
- 성공적으로 트랜잭션이 수행되고 그 결과가 한번 DB나 비즈니스 로직에 반영된다면 영구히 반영되야 한다는 것을 의미한다.
- Commit(커밋)을 통해 이를 수행할 수 있다.
- 관계형 데이터베이스 관리 시스템(RDBMS)에서 트랜잭션을 종료하고 다른 사용자에게 변경된 모든 사항을 보이도록 만드는 문이다.
- 일반적으로 트랜잭션 종료시 해당 업데이트를 확정한다는 의미에서 "커밋"이라고 사용한다
- 데이터베이스에서 업데이트에 오류가 발생할 때, 이전 상태로 되돌리는 것을 말한다.
- 오류 동작 이후에도 깨끗한 사본으로 복원시킬 수 있기 때문에, 무결성을 위해 중요하다.
댓글남기기