
transaction의 의미는 '거래'
- 거래라는 것은 양쪽에서 성사되어야 의미가 있다. 그런 시각에서 바라본다면 직관적이다.
- 트랜젝션은 여러 작업을 하나의 작업처럼 결과를 낼 수 있다.
- 공부하면서 트랜젝션은 타임머신 같다고 생각했다.
예를들어 택배를 보냈는데 배송과정에서 택배를 분실했다.
보낸 사람은 있지만, 받은 사람이 없다.
그런데 택배 회사에서는 배송 완료처리를 해버려서 잃어버린 택배에 대한 보상도 받을 수 없게된 상황이라면?
- 시간을 돌려서 택배를 보내기 전으로 돌아가고 싶을 것이다.
그걸 가능하게 해주는 게 트랜젝션이다.
- 여러 작업이 모두 성공해야 성공으로 처리하고, 하나라도 실패하면 작업하기 이전으로 돌아간다.
- 트랜젝션은 하나라도 실패하면 성공처리 하지 않고, 작업 전으로 되돌아갈 수 있다는 것이 큰 힘이다.
commit
- 모든 작업이 완료되면 commit을 통해 저장한다.
rollback
- 작업중 하나라도 실패하면 작업 전으로 돌려버린다.
- 정확히는 트랜젝션이 시작했을 때로 데이터를 돌려버린다.
클라이언트가 DB서버에 커넥션을 요청하면 커넥션이 맺게되는데 이때 이 커넥션의 실행을 맡아줄 세션이 DB내부에 생성된다.
- 세션은 트렉젝션을 시작하고 sql문을 실행하고, 성공하면 저장한다.
- 세션은 커넥션이 끊기기 전까지 유효하다.
- 커넥션만큼 각각의 세션이 생성된다.
1번: insert into member(member_id, age) values("memberA", 20);
2번: insert into member(member_id, age) values("memberB", 30);
자동커밋
- 말 그대로 자동으로 커밋해주는 걸 말한다.
- sql문을 실행할 때, 하나 실행하고 커밋, 하나 실행하고 커밋한다.
멤버를 추가하는 쿼리문을 보면 1번 실행하고 커밋, 2번 실행하고 커밋한다고 생각하면 됨.- 대부분의 DB는 기본적으로 자동커밋으로 되어있다.
- 알아서 커밋해버리기 때문에 트랙젝션을 사용하지도 못함.
set autocommit false;
1번: insert into member(member_id, age) values("memberA", 20);
2번: insert into member(member_id, age) values("memberB", 30);
set autocommit false;
- 자동 커밋을 수동 커밋으로 바꾼다.
- 1번과 2번을 실행해도 커밋이 안 되어있다.
- 커밋이 안 되어있으니까, 내가 아닌 다른 관리자가 DB에 데이터를 조회해도 1번, 2번 데이터는 볼 수 없다.
set autocommit false; //수동 커밋모드로 설정
1번: insert into member(member_id, age) values("memberA", 20);
2번: insert into member(member_id, age) values("memberB", 30);
commit;
마지막에 커밋을 해줬기 때문에 지금은 누가 조회해도 다 볼 수 있다.
자동 커밋과 다르게 수동 커밋은 직접 커밋 해줘야 한다.
- 이처럼 커밋이나 롤백을 선택해서 할 수 있다.
- 트랜젝션을 있는 그대로 사용할 수 있는 상태라서 수동 커밋으로 설정하는 것을 '트랜젝션의 시작'이라고 한다.
- 마지막에 commit;이 아니라 rollback;을 하면 나에게도 1번과 2번이 사라진다.
- 정확히는 트랜젝션을 시작했을 때로 돌아간다.