transaction이란? 단위별 데이터 처리 / 한 명의 사용자에 의해 한개 이상의 SQL 구문을 처리하는 가장 작은 논리적 작업이다. 클라이언트 컴퓨터 자료의 변화에 대해 commit이나 rollback으로 원본 DB에 저장 또는 취소 처리를 할 수 있다. 데이터를 일관성있게 보장할 수 있다.
TCL(transaction control language) : commit, rollback, savepoint
transaction 처리 순서
1) insert, update, delete 수행 후 transaction이 시작
2) commit 또는 rollback에 의해 transaction 종료
MariaDB의 경우 autocommit이 기본값으로 설정되어 있다.
autocommit 설정 : set autocommit = true
autocommit 해제 : set autocommit = false
트렌젝션을 설명하는 대표적인 예시로는 은행이 있다.
출처 : https://myjamong.tistory.com/180
위 그림과 같이 송금처리 과정에서 오류가 발생한다면 A계좌에서 보낸 $5000은 B계좌에 입금되지 않는다. 그렇게 된다면 $5000은 사라지게 된다. 실제로 이런 문제가 은행에서 발생한다면 엄청난 피해가 일어날 수 있다. 그렇기 때문에 예상하지 못한 상황에서 오류가 발생하여 데이터의 부정합이 발생하는경우, 다시 원상복귀를 해야한다. 이것이 바로 transaction을 사용하는 이유이다.
SHOW VARIABLES LIKE 'autocommit%'; -- autocommit 상태 확인
set autocommit = FALSE; -- autocommit 끄기
DELETE FROM jiktab WHERE jikwon_no = 2; -- transaction 시작
ROLLBACK; -- 로컬 컴퓨터에서 실행한 delete를 취소 -- transaction 끝
위 그림은 위의 SQL문처럼 autocommit을 끈 후 command prompt를 이용해 table의 상태를 본것이다. SQL문으로는 jikwon_no가 2인 행을 삭제 했지만 rollback을 만나면서 실제로는 삭제 되지 않았다.
DELETE FROM jiktab WHERE jikwon_no = 2; -- transaction 시작
COMMIT; -- 로컬 컴퓨터에서 실행한 delete를 근거로 데이터베이스 서버의 자료가 갱신
-- transaction 끝
SELECT * FROM jiktab;
위 그림은 앞서 본 그림과 달리 commit을 한 상태이다. commit을 하니 jikwon_no가 2인 행을 삭제했다.
보는 바와 같이 commit 명령어는 수행을 저장하고, rollback명령어는 수행을 취소한다고 볼 수 있다.
savepoint(저장점) 를 사용해 작업의 일부만 commit 또는 rollback 할 수 있다.
SELECT * FROM jiktab WHERE jikwon_no = 4;
UPDATE jiktab SET jikwon_pay = 9876 WHERE jikwon_no = 4; -- transaction 시작
SELECT * FROM jiktab;
SAVEPOINT a1;
UPDATE jiktab SET jikwon_pay = 10000 WHERE jikwon_no = 5;
ROLLBACK TO SAVEPOINT a1; -- 4번은 저장점 때문에 그대로 5번은 rollback
SELECT * FROM jiktab;
ROLLBACK;
SELECT * FROM jiktab; -- transaction 끝 -- 지금까지의 내용 모두 취소 (4,5 둘다)
UPDATE jiktab SET jikwon_pay = 11000 WHERE jikwon_no = 3; -- transaction 시작
COMMIT; -- transaction 끝
SELECT * FROM jiktab;
SET autocommit = TRUE;
SHOW VARIABLES LIKE 'autocommit%'; -- 작업끝나면 autocommit으로 돌려놓기
deadlock이란? 트렌젝션이 원활한 진행을 막고 충돌을 보이는 현상이다.
이를 해결하기 위해서 충돌 원인을 제공한 컴퓨터에서 트렌젝션 작업을 commit or rollback해야한다. deadlock은 시간과 자원을 낭비하므로 data를 일관성 있게 사용하는 것이 중요하다.
SET autocommit = FALSE;
UPDATE jiktab SET jikwon_pay = 8888 WHERE jikwon_no = 3; -- transaction 시작
SELECT * FROM jiktab;
COMMIT; -- deadlock 풀림