SQL 첫걸음 - 8장 트렌젝션(3/3)
1. 트랜잭션
발주처리의 예로 주문이 발생했을 경우, 주문 테이블에는 INSERT 한 번, 주문상품 테이블에는 주문된 상품 수 만큼 INSERT명령이 실행됨.
ex) 발주처리
INSERT INTO 주문
VALUES(4, '2018-09-30', 1);
INSERT INTO 주문상품
VALUES(4, '0003', 1);
INSERT INTO 주문상품
VALUES(4, '0004', 2);
이때, 세 번째 INSERT 명령에서 에러가 발생했다고 치면, 트랜잭션 기능을 사용하지 않을 경우. 앞서 실행한 두 개의 INSERT명령에 의해 주가된 데이터를 DELETE명령으로 삭제하는 처리가 필요함. 이는 매우 번거로움.
2. 롤백과 커밋
위 경우처럼 몇 단계로 처리를 나누어 SQL명령을 실행하는 경우에 트랜잭션을 자주 사용. 트랜잭션을 사용해 데이터를 추가한다면 에러가 발생해도 트랜잭션을 롤백(rollback)해서 종료할 수 있음. 롤백하면 트랜잭션 내에서 행해진 모든 변경사항을 없었던 것으로 돌림. 아무런 에러가 발생하지 않는다면 변경사항을 적용하고 트랜잭션을 종료하는데 이때 커밋(commit)을 사용. mysql클라이언트에서 명령을 실행할 때는 자동커밋이 켜져 있는데, 자동커밋을 끄기 위해서는 명시적으로 트랜잭션을 시작을 선언할 필요가 있음. 트랜잭션을 시작할 때는 START TRANSACTION 명령을 사용. 트랜잭션을 종료하기 위해 변경된 내용을 적용한 후 종료하는 ‘커밋’과 적용하지않고 종료하는 ‘롤백’의 두가지 방법이 있음. 커밋 시에는 COMMIT 명령을, 롤백은 ROLLBACK 명령을 사용.
ex) 트랜잭션 내에서의 발주처리
//START TRANSACTION
INSERT INTO 주문
VALUES(4, '2018-09-30', 1);
INSERT INTO 주문상품
VALUES(4, '0003', 1);
INSERT INTO 주문상품
VALUES(4, '0004', 2);
COMMIT;
=> 이렇게 트랜잭션을 시작해서 SQL명령을 실행하고 COMMIT 또는 ROLLBACK명령으로 트랜잭션을 종료하는 일련의 처리방법을 ‘트랜잭션을 걸어서 실행한다’ 또는 ‘트랜잭션 내에서 실행한다’라고 말함.
3. 트랜잭션 사용법
트랜잭션 내에서 실행하는 복수의 SQL 명령은 세트 단위로 유효/무효가 되므로, 반드시 세트로 실행하고 싶은 SQL명령을 트랜잭션에서 하나로 묶어 실행한다.
트랜잭션을 시작할 때 사용하는 명령은 ..
MySQL 의 경우
START TRANSACTION ( BEGIN도 사용가능 )
SQL Server나 PostgreSQL
BEGIN TRANSACTION
Oracle이나 DB2
트랜잭션을 시작하는 명령은 따로 없음. (표준화가 진행되지 못한 부분) 자동커밋은 클라이언트 툴의 기능. 미들웨어도 데이터베이스 접속 시 대게 자동커밋을 함. 한편, 데이터베이스 서버에서는 언제나 트랜잭션을 걸 수 있는 상태로 SQL 명령이 실행됨. DELETE 명령 역시 트랜잭션 내에서 실행하는 경우 ROLLBACK으로 삭제를 취소할 수 있음.
출처 : https://smilejh.tistory.com/