
MySQL을 사용하면 SET AUTOCOMMIT = 1; 혹은 SET AUTOCOMMIT = 0;의 쿼리를 본 적이 있을 것이다.
이 auto-commit 이 도대체 뭘까?
RDS를 사용하면 트랜잭션을 사용하게 된다. 트랜잭션을 간단히 설명하면 일련의 작업 단위를 하나로 묶어서 처리할 수 있도록 해주는 것을 의미하는데, 이는 한번에 묶어서 처리되는 만큼 한꺼번에 모두 성공하거나, 모두 실패해야한다.
하나의 트랜잭션은 COMMIT이나 ROLLBACK을 만나면 끝이 난다.
만약 A 사용자가 계좌에서 10만원을 출금하여 B한테 송금하는 상황이 있다고 하면,
작업 A, 작업 B, 총 2개의 작업 단위로 나뉠 것이다.

순서대로 작업 되던 중 작업 A와 작업 B 사이에서 오류가 발생한다면?
이미 작업 A는 처리되어 commit된 시점이라, A의 돈 10만원은 차감되어 있는 상황이다.

문제가 발생되었기 때문에 rollback을 하게 되는데, 가장 가까운 commit 시점인 A가 끝난 시점으로 돌아가게 된다.
이러면 A 사용자는 돈 10만원을 그냥 날리게 된다.
따라서 이러한 문제를 해결하기 위해 "작업 단위"를 직접 지정하는 것이다.

auto-commit을 false로 해두었기 때문에 작업 A 를 진행하던 도중에 어디에서든 문제가 발생해도 맨 처음 "A계좌 조회" 전의 시작단계로 rollback하게 된다.
이전과 같은 상황이라면 A의 10만원 또한 복구될 것 이다.
이것이 JDBC의 기본적인 트랜잭션 방법이자, Spring의 @Transactional 의 핵심이다.
위에서 언급한대로 'Java에서 트랜잭션을 시작하는 유일한 방법'이기 때문에 Spring의 @Transactional 도 동일하게 동작한다.
비즈니스 로직의 요구사항 중 id가 1번인 유저의 이름을 민정으로, id가 2번인 유저의 이름을 조앤으로 바꿔야하며 이 두가지는 무조건 함께 실행되어야하고 하나만 성공해서는 안된다는 요구사항이 있다.
SET AUTOCOMMIT = 1;
update students set name = "민정" where id = 1; -- 이하 첫번째 쿼리
update students set name = "조앤" where id = 2; -- 이하 두번째 쿼리
위와 같이 쿼리를 수행하는 중, 만약 두번째 쿼리가 실패하게 된다면?
SET AUTOCOMMIT = 1로 설정되어있기 때문에 이미 첫번째 쿼리는 정상적으로 COMMIT 되어 데이터베이스에 반영되었고, 실패한 두번째쿼리만 데이터베이스에 반영되지 않았다.
헉! 둘다 성공하거나 실패해야하는데 AUTOCOMMIT 속성 때문에 수행한 쿼리 단건이 자동으로 커밋되어버려 두 쿼리를 트랜잭션으로 묶지 못했다..
만약 SET AUTOCOMMIT = 0;으로 설정되어있었다면?
SET AUTOCOMMIT = 0;
update students set name = "민정" where id = 1; -- 이하 첫번째 쿼리
update students set name = "조앤" where id = 2; -- 이하 두번째 쿼리
COMMIT;
두 쿼리가 끝나는 시점에 COMMIT을 수행하기 때문에 두번째 쿼리가 실패했다면 모두 ROLLBACK된다.
즉 AUTOCOMMIT이란 모든 단건의 쿼리마다 자동으로 COMMIT이 실행되어 데이터베이스에 영구적으로 반영되도록 하는 명령을 말한다.
참고: 1번 예시 - https://blogshine.tistory.com/291,
2번 예시 -https://velog.io/@seovalue/autocommit%EC%9D%B4-%EB%8F%84%EB%8C%80%EC%B2%B4-%EB%AD%94%EB%8D%B0