데이터 거래(Transaction)에 있어서 안전성을 확보하기 위한 방법이 트랜잭션이다.
데이터 베이스에서 데이터 처리의 한 단위를 트랜잭션이라고 부른다. 대부분의 데이터 베이스는 데이터를 저장하고 수정하고 삭제하는 작업을 바로 물리적인 하드디스크에 저장된 데이터에 반영하지 않는다. 개발자의 실수로 잘못된 명령문을 입력하였을 경우, 다시 원래 상태로 되돌리기 위한 안전장치인 역할이다..
따라서 개발자가 커밋이라는 작업을 하기 전까지 입력한 명령문은 메모리에서만 동작한다. 즉, 물리적인 하드디스크에 반영하지 않는다. 커밋 작업이 발생하면 그떄 하드디스크에 반영하게 된다. 개발자가 데이터에 대한 작업을 하기 위해 입력하는 명령문들의 시작부터 커밋까지를 하나의 트랜젝션이라고 한다
트랜잭션은 데이터베이스를 상태를 바꾸는 일종의 작업 단위라고 했다 작업의 단위는 질의어 한문장이 아니라는 점이다. 작업단위란 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것을 의미한다.
다음은 트랜잭션의 예를 들어보겠다. 🔽
게시판을 예로 들어보자.
1) 게시판 사용자는 게시글을 작성하고, 올리기 버튼을 누른다.
2) 그러면 글 올리기가 처리되고 자동으로 다시 게시판에 돌아오게 된다.
3) 게시판에서 자신의 글이 포함된 업데이트된 게시글들을 볼 수 있다.
이러한 상황을 데이터베이스 작업으로 옮기면, 사용자가 올리기 버튼을 눌렀을 시,
Insert 문을 사용하여 사용자가 입력한 게시글의 데이터를 넣는다.
그 후에, 게시판을 구성할 데이터를 다시 Select 하여 최신 정보로 유지한다. 여기서 작업의 단위는 insert문과 select문 둘다 를 합친것이다. 이러한 작업단위를 하나의 트랜잭션이라 한다.
자동 트랜잭션
그럼 우리가 트랜잭션을 처리해준적이 있었나?
우리가 MySQL의 입력하는 모든 명령어들은 각각 하나의 트랜잭션이라고 할 수 있다. INSERT, DELETE, UPDATE 등의 SQL 명령문을 통해 데이터를 상태를 바꿀 때마다 자동적으로 Commit을 실행하여 변경된 내역을 데이터베이스의 반영하는 것이다. (git의 Commit과 유사하다고 볼 수 있다.)
즉 여태까지 입력한 명령어들은 MySQL에서 자동 Commit을 통해 쿼리 입력과 동시에 처리하여 데이터베이스에 반영되게 한 것이다.
아래 명령어를 통해 트랜잭션을 실행할 수 있다, 이때 Commit 방식은 수동 Commit으로 바뀐다.
START TRANSACTION;
수동 트랜잭션으로 시작하고 데이터를 insert하고 select 해보는 명령어를 사용해보겠다.
START TRANSACTION; -- 트랜잭션 시작
select * from members; -- 초기 상태 보여줌
insert into members values(1, '쿠', '크다스', '크라운제과' '?', '대한민국'); -- 데이터 수정
select * from members; -- 수정 상태 보여줌
COMMIT -- 트랜잭션을 DB에 적용
select * from members; -- 적용된 결과 조회


Roll-back은 작업 중 문제가 발생되어 트랜잭션의 처리 과정에서 발생한 변경사항을 취소하는 명령어이다.
해당 명령을 트랜잭션에게 하달하면, 트랜잭션은 시작되기 이전의 상태로 되돌아간다. 이것은 마지막 Commit을 완료한 시점으로 돌아간다는 말과 상통한다.
즉, Rollback은 Commit하여 저장한 예전 상태를 복구하는 것이다.
START TRANSACTION; -- 트랜잭션 시작
insert into members values(5, '쿠', '크다스 동생', '크라운제과', '?', '대한민국'); -- 데이터 수정
select * from members; -- 수정 상태 보여줌
ROLLBACK -- 트랜잭션을 취소하고 START TRANSACTION 실행 전 상태로 롤백함
select * from members; -- 조회

롤백 적용되지 않는 DDL문
모든 명령어에 대하여 트랜잭션의 롤백 명령이 적용되는 것은 아니다.
DDL문(CREATE, DROP, ALTER, RENAME, TRUNCATE)은 transaction의 rollback 대상이 아니다.