20장 트랜잭션 처리 관리하기
트랜잭션 처리 이해하기
트랜잭션 처리는 여러 개의 SQL 작업을 일괄적으로 실행하거나 아니면 아예 실행하지 않도록 하여 을 보장하는 처리 방식이다. 관계형 데이터베이스는 데이터를 여러 테이블에 나눠 저장하여 데이터를 쉽게 조작, 관리, 재사용 가능하게 설계되었다. 예를 들어 시스템에 주문을 추가하는 경우
데이터베이스에 고객이 있는지 확인하고, 없다면 고객을 추가한다.
고객 ID를 가져온다.
고객 ID로 Orders 테이블에 새로운 행을 추가한다.
Orders 테이블에 할당된 새로운 주문 ID를 가져온다.
OrderItems 테이블에 주문된 제품을 모두 추가한다. 이때 Orders 테이블에서 가져온 ID를 사용해 Orders 테이블과 연결된다. 그리고 제품 ID로 Products 테이블과 연결한다.
위의 과정을 거친다. 그런데 새로운 데이터를 추가한 이후 모종의 이유로 작업이 중단된다면? 불필요한 데이터만 쌓이고 작업을 새로 시작해야 한다. 이와 같은 문제를 위해 트랜잭션 처리를 사용한다.
트랜잭션 처리는 데이터베이스가 부분적으로 작업을 수행하는 것을 막기 위해 여러 SQL 작업을 일괄적으로 처리하는 매커니즘이다. 트랜잭션 처리를 이용하면, 작업이 중단되지 않도록 할 수 있다. (전체가 실행되거나 아예 실행되지 않는다.) 트랜잭션 처리 시 에러가 발생하지 않으면, SQL 문 전체가 데이터베이스 테이블에 된다. 에러가 발생하면, 되어 데이터베이스가 안전한 상태로 복구된다. 다음과 같은 과정을 거친다.
데이터베이스에 고객이 있는지 확인하고, 없다면 고객을 추가한다.
고객 정보를 커밋한다. - NEW
고객 ID를 가져온다.
Orders 테이블에 새로운 행을 추가한다.
Orders 테이블에 행을 추가할 때 에러가 발생하면 롤백한다. - NEW
Orders 테이블에 할당한 새로운 주문 ID를 가져온다.
OrderItems 테이블에 주문된 제품을 모두 추가한다.
OrderItems 테이블에 행 추가시, 에러가 발생하면 OrderItems에 추가한 모든 행과 Orders 테이블에 추가한 행을 롤백한다. - NEW
이처럼 트랜잭션 처리는 예기치 못한 상황으로 데이터 무결성이 깨지는 것을 방지한다.
기억할 키워드
트랜잭션 Transaction - 일괄 처리할 SQL 명령어들을 묶은 블록
롤백 Rollback - 변경된 작업 내용을 모두 취소하는 절차
커밋 Commit - 변경된 작업 내용을 데이터베이스에 저장
저장점 Savepoint - 부분적으로 롤백하기 위한 임시 지점
어떤 문을 롤백할 수 있을까?
트랜잭션 처리는 INSERT, UPDATE, DELETE 문을 관리하기 위해 사용한다.
SELECT, CREATE, DROP 문은 롤백할 수 없다. 트랜잭션 블록 내에서 쓰일 수는 있지만, 롤백하더라도 작업을 되돌릴 순 없다.
트랜잭션 통제하기
트랜잭션을 관리하는데 가장 중요한 점은 SQL 문을 논리적 작업 단위로 만들어 데이터가 롤백되어야 하는 시점과 그렇지 않은 시점을 확실하게 명시하는 것이다. 일부 DBMS는 트랜잭션의 시작과 끝을 지정해야 하지만 대부분의 DBMS는 트랜잭션의 끝을 지정하지 않는다. 대신 트랜잭션 끝을 알리는 특정 명령문이 나타날 때까지 유지되는데, 보통 COMMIT으로 변경 사항을 저장하거나 ROLLBACK으로 되돌릴 때까지 유지된다.
롤백 사용하기
SQL 문을 롤백하기 위한 ROLLBACK 명령어
ㄴ 위 예시에서는 DELETE 작업이 수행되고 ROLLBACK 문으로 되돌린다.
ㄴ 좋지 않은 예시지만 트랜잭션 내에서 DELETE 작업은 INSERT나 UPDATE처럼 절대 수행되지 않음을 알 수 있다.
커밋 사용하기
보통 SQL 문은 실행되면서 데이터베이스 테이블을 바로 변경한다. 이렇게 자동으로 커밋이 발생하는 것을 자동 커밋이라 부른다. 트랜잭션은 자동으로 커밋되지 않는다. (일부 DBMS는 됨)
커밋을 명시하기 위해 COMMIT 문이 사용된다.
저장점 사용하기
ROLLBACK과 COMMIT 문은 단순히 전체 트랜잭션을 저장하거나 되돌리는 작업만 한다. 복잡한 트랜잭션은 부분적인 커밋이나 롤백이 필요할 수 있다.
트랜잭션의 부분적 롤백은 트랜잭션에서 전략상 중요한 위치를 임시 지점으로 정하고, 롤백이 필요할 때 임시 지점 중 하나로 되돌리는 개념이다.
SQL에서는 이 임시 지점을 저장점이라 부른다.
저장점은 각 저장점을 구별할 수 있는 고유한 이름을 갖기에 롤백시 특정 저장점을 지정할 수 있다.
저장점은 많으면 좋다
저장점의 개수에는 제한이 없으며 SQL 코드를 작성할 때 저장점이 많이 사용될수록 좋다. 저장점이 많을수록 정확히 필요한 지점으로 롤백할 수 있기 때문이다.
정리하기
트랜잭션 정의와 사용법
COMMIT, ROLLBACK, SAVEPOINT
Last updated
Was this helpful?