트랜잭션이란?
데이터베이스의 상태를 변화시키는 논리적 기능을 수행하는 작업의 단위.
사용자가 특정 기능 수행을 위해 SQL작업을 묶은 단위이다.
데이터베이스의 상태를 변화시킨다는 것은 무슨 의미일까?
아래 SQL을 이용해 데이터 베이스를 접근하는 것을 의미한다.
SELECT
INSERT
DELETE
UPDATE
하지만 주의해야할 점이 있는데, 트랜잭션의 단위는 이 질의어 한문장이 아니다.
게시판 사용자는 게시글을 작성하고, 올리기 버튼을 누른다. 그리고 다시 게시판에 돌아왔을때,
자신의 글이 포함된 업데이트된 게시판을 보게 된다.
이를 데이터 베이스 작업으로 옮기면 Insert문을 사용, 사용자가 입력한 게시글 데이터를 옮기고.
게시판을 구성할 데이터를 다시 select하여 최신정보로 유지한다.
여기서 작업의 단위는 insert문과 select문을 실행하기 까지의 과정.
이것을 하나의 트랜잭션이라 한다.
관리자나 개발자가 하나의 트랜잭션 설계를 잘하면 , 데이터를 다루는 것에 큰 이점에 있다.
DBMS의 성능은 초당 트랜잭션의 실행수 TPS로 측정한다.
트랜잭션의 특징
1.DB시스템에서 병행 제어 및 회복 작업시 처리되는 하나의 논리적 단위이다.
2.사용자의 요청시 시스템이 응답하기위해 데이터베이스의 상태를 변화시키는
논리적 기능을 수행하는 작업의 단위이다.
3.하나의 트랜잭션은 Commit되거나 rollback 될 수 있다.
트랜잭션의 성질. 원자성, 일관성, 독립성, 지속성 ACID
1.원자성 atomicity
트랜잭션이 데이터베이스에 모두 반영되던가, all or nothings
트랜 잭션 과정중 하나라도 오류가 발생하면 전혀 반영되지 않은채로 취소 되어야 한다.
-원자성 보장
트랜잭션 내 데이터베이스를 수정할때, 지금까지의 성공 상태가 롤백 세그먼트라는 임시 영역에 저장되며,
문제가 생겨 롤백이 일어난다면, 롤백 세그먼트 내의 상태가 복구된다. 참고로 트랜잭션을 commit한 후에는
DB에 수정사항이 영구적으로 반영되기 떄문에 롤백 세그먼트의 롤백이미지도 날아간다.
즉 성공적인 지점까지 savePoint를 설정해 롤백한다.
다만 SP로 롤백할경우 그 시점의 앞에 있던 SP는 전부 삭제된다.
트랜잭션은 사람이 설계한 논리적 작업단위로,
원자성이 지켜지지 않은채 쿼리문이 중간에 끊긴다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동시 원인 찾기가 매우 힘들어질 것이다.
2.일관성 consistency
트랜잭션의 작업처리 결과가 항상 일관성 있어야 한다. 즉 CorretState를 유지한다.
이는 도메인의 유효범위, 무결성 제약조건을 위배하지 않는 상태를 의미한다.
데이터 타입등이나 null값의 제한 상태등 기존 고정요소는 트랜잭션 수행 전후의 상태가 같아야 한다.
또한 연관관계에서 변경이 일어났으면, 외래키 값도 정상적으로 변경돼야 한다.
3.독립성 isolation
각각의 트랜잭션은 서로 간섭없이 독립적으로 수행된다.
하지만 이를 완전히 보장하는 것은 동시성 처리 성능을 매우 나 쁘게한다.
따라서 격리성의 수준에는 여러 단계가 있다.
READ UNCOMMITED
사용자 a의 트랜잭션이 커밋을 마치지 않고 수정중이더라도 사용자 b는 그 데이터를 조회할 수 있다.
이를 dirty read라고 하는데, 만약 b가 a의 데이터를 조회해 사용하는 중에 a가 롤백시켜 버리면
데이터 정합성이 깨질 수 있다.
READ COMMITED
상대방이 커밋한 데이터만 조회할 수 있기때문에 Dirty read가 발생하지 않는다,
하지만 NON-REPEATABLE READ가 발생할 수 있다.
사용자 a가 커밋한 데이터를 사용자 b가 트랜잭션 내에서 조회하고 있는데, 조회중 사용자 a가 수정후 다시 커밋한다면 같은 트랜잭션 내에서 다른 데이터를 조회하게 된다.
REPEATABLE READ
한번 조회한 데이터는, 트랜잭션 내에서 다시 조회해도 같은 데이터가 나오는게 보장된다.
하지만 PHANTOM READ가 발생할 수 있다.
SERIALABLE
가장 엄격한 수준의 격리성이지만 동시성 처리에 매우 약하며 보통의 데이터 베이스들은 READ COMMITED수준의 격리성을 사용한다.
4.지속성 durablility
트랜잭션이 성공적으로 완료 됐을 경우, 결과는 영구적으로 반영돼야 한다.
또 오류가 발생하더라도, 데이터 베이스로그를 참고해 성공했던 트랜잭션을 복구할 수 있다.
commit연산
하나의 트랜잭션이 성공적으로 끝났고, 데이터 베이스가 일관성 있는 상태에 있을때
수행한 트랜잭션을 로그에 저장한다.
rollback연산
하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 트랜잭션의 연산을 모두 취소하거나 부분적으로 취소하는 것이다.
트랜잭션의 상태
active: 트랜잭션이 실행중인 상태
failed: 트랜잭션 실행에 오류가 발생해 중단된 상태
aborted: 트랜잭션이 비정상적으로 종료돼 롤백연산을 실행한 상태
partially comitted: 마지막 연산까지 실행했으나, commit연산이 실행되기 직전의 상태
committed: 트랜잭션을 성공적으로 종료하고 commit연산까지 실행한 후의 상태
주의점
트랜 잭션은 꼭 필요한 최소의 코드에 적용해 트랜잭션의 범위를 최소화하는 것이 좋다.
일반적으로 데이터베이스 커넥션은 개수가 제한적이다.
그런데 각 단위 프로그램이 커넥션을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 개수가 줄어들게 된다.
즉 대기시간이 발생할 수 있다.
참고
'데이터베이스 > 데이터베이스 기초지식' 카테고리의 다른 글
데이터베이스란 무엇인가? (0) | 2022.11.17 |
---|
댓글