자동커밋/ 수동커밋
트랜잭션을 사용하려면 먼저 자동커밋과 수동커밋을 이해해야한다
자동커밋은 각각의 쿼리 실행 직후 자동으로 커밋을 호출하고
수동커밋은 말그대로 수동으로 commit을 해야 커밋이 된다
쿼리의 기본설정은 자동커밋이므로 transaction을 사용하기 위해선
수동커밋으로 설정해야한다
<자동커밋설정>
set autocommit true; //자동커밋설정
insert into member(member_id, money) values (‘data3’, 10000);//자동커밋
insert into member(member_id, money) values (‘data4’, 10000);//자동커밋
<수동커밋설정>
set autocommit false;//수동커밋설정
insert into member(member_id, money) values (‘data3’, 10000);
insert into member(member_id, money) values (‘data4’, 10000);
commit; //수동커밋
따라서 수동커밋 모드를 설정하는것을 트랜잭션을 시작한다고 할수있다.
수동커밋을 설정하면 이후에 꼭 ‘commit’, ‘rollback’을 호출해야한다
보통 timeout이 되면 자동으로 rollback이된다
예시)
계좌이체를 예시로 트랜잭션이 어떻게 사용되는지 알아보자
- 계좌이체 정상
- 계좌이체 문제 상황 - commit
- 계좌이체 문제 상황 - rollback
계좌이체 정상
맴버A와 맴버B에 각각 10000원씩 데이터를 넣고
계좌이체를 실행해본다
맴버A에서는 -2000원을, 맴버B는 +2000원을 계좌이체하는 트랜잭션을 실행해본다
이렇게 되기 위해선 update 쿼리는 2번 수행되어야 한다
set autocommit false;
update member set money=10000 - 2000 where member_id = ‘memberA’;
update member set money=10000 + 2000 where member_id = ‘memberB’;
커밋하기전에는 ‘임시’상태가 된다
commit;
커밋 후 상태는 ‘완료’상태가 되며 양쪽세션에서 select시 같은 데이터값을 얻을수있다.
계좌이체 문제상황- commit
SQL에 오류가 있어 memberA의 돈은 2000원 줄어들었지만
memberB는 그대로 10000원이다.
세션1은 A가 8000원인 상태로 조회되고, 세션B에서는 그대로 A,B둘다 10000원으로 조회된다.
여기서 commit을 하게되면
맴버A의 돈만 2000원이 줄어드는 문제가 발생한다.
계좌이체 문제상황 - rollback
같은 문제상황일때 이럴때는 commit이 아닌 rollback을 호출해서 트랜잭션을 시작하기 전단계로 데이터를 복구해야한다
rollback;
롤백후 조회하게 되면 트랜잭션을 시작하기 전 단계로 데이터가 복구된다.
<정리>
- 원자성 : 트랜잭션 내에서 실행한 작업들은 마치 하나의 로직인것처럼 모두 성공하거나 모두 실패하여야 한다.(All or Nothing)
- 오토커밋 : 만약 오토커밋으로 동작하는 계좌이체가 중간에 실패하면? 쿼리를 하나하나 실행하기떄문에 한쪽의 계좌에서만 돈이 줄어드는 심각한 상황이 발생한다.
- 트랜잭션 시작: 따라서 이런 종류의 작업은 꼭 수동커밋을 사용해서 수동으로 commit, rollback을 할수있도록 해야한다.
'코딩조각' 카테고리의 다른 글
[Collection]왜 HashMap선언을 Map<String, Object> map = new Hashmap<String,Object>(); 로 선언할까? (1) | 2023.11.02 |
---|---|
[web] Dynamic IP와 Static IP (0) | 2023.03.14 |
[spring]DAO, DTO, VO 란? (0) | 2023.01.13 |
[oracle] oracle SQL 유용한 문자함수 숫자함수 (0) | 2023.01.02 |
[Spring Security] Spring security의 간단한 과정 (0) | 2022.12.27 |