데이터베이스 환경에서의 트랜잭션은 2가지 주된 목적을 가진다.
1. 시스템 상 오류(failure,stop)이 있을 때 keep database consistent , allow correct recovery 하기 위해
2. 데이터베이스에 동시에 접근할 때 isolation을 제공하기 위해 : isolation이 없으면 에러가 발생
▶정의
-일련의 DB 연산들로 구성된 논리적 연산 단위 ( 때로는 made up of multiple operations) 또는 응용 프로그램 실행 인 스턴스로 다음의 특성을 만족해야 한다.
▶기본 표현
-시작: START TRANSACTION;
-종료: COMMIT; 또는 ROLLBACK;
⇒ COMMIT; 은 성공적인 종료
ROLLBACK; 은 그 전까지의 작업을 취소시킨다.
▶특성(ACID)
1. 원자성(atomicity)
-효과가 all or nothing, 할거면 하고 안 할거면 아예 안해야 된다.
⇒각 트랜잭션이 single "unit"으로 다뤄지게 해준다.
-전에 COMMIT된 상태를 임시 영역에 따로 저장해 놓는다.
⇒확실한 부분에 대해서는 SAVEPOINT를 사용하여 ROLLBACK 되지 않게 한다.
SAVEPOINT A;
ROLLABCK TO A;
2. 고립성(isolation)
-효과가 다른 트랜잭션의 영향으로부터 독집적이어야 함
-locking: 고립성을 위한 하나의 방법
⇒shared lock: 읽을 때 , exclusive lock: 쓸 때
⇒MySQL의 SELECT는 shared lock을 사용하지 않고 LOCK in SHARE MODE 사용
START TRANSACTION;
INSERT INTO # 데이터를 쓰기 때문에 EXCLUSIVE LOCK
SELECT * FROM
COMMIT;
SELECT * FROM "TABLE" LOCK IN SHARE MODE;
다른 세션을 열어 위의 SELECT 문을 실행하면 COMMIT이 이루어지기 전까지는 실행되지 않고 RUNNING이라고만 뜬다. EXCLUSIVE LOCK이 걸려있기 때문에.
START TRANSACTION이 없을 때는 각각의 명령문이 transaction으로 간주된다.
innoDB에서는 transaction이 가능하나, myIsam에서는 불가능하다.
3. 일관성(consistency)
-must conform to existing constraints in the database
⇒어떻게 일관성을 보장할까? 트리거를 통해.
4. 지속성(durability)
-완료된 트랜잭션은 영원히 반영되야 함
-must get written to persistent storage
이 특성들을 모두 줄여서 ACID라 한다.