이전에 구현했던 레벨 관리 기능에서 의문이 있다.
만약 사용자 레벨 관리 작업을 수행하는 도중에 서버에 장애가 생겨서 작업을 완료할 수 없다면, 그때까지 변경된 사용자의 레벨은 그대로 두어야할까? 되돌려야할까?
→ 일부 사용자만 레벨이 오른다면 반발이 있을 수도 있으므로 되돌리는 방향으로 하기로 했다.
현재의 레벨 관리 기능은 총 4명의 사용자의 레벨을 업데이트 하려는데 두번째 사용자를 업데이트 한 뒤에 에러가 발생 한다면 두번째 사용자까지는 레벨이 업데이트 된 상태이다.
→ upgradeLevels() 메소드가 하나의 트랜잭션 안에서 동작하지 않았기 때문이다.
트랜잭션이란 더 이상 나눌 수 없는 단위 작업을 말한다.
즉 upgradeLevels() 메소드가 하나의 트랜잭션 안에서 동작한다면 2번째 사용자를 업데이트 한 뒤 에러가 발생한다면 2번째 사용자까지 업데이트한 작업은 취소된다.
이런 취소작업을 “트랜잭션 롤백”이라고 하고, 성공적으로 하나의 트랜잭션을 마치고 DB에 결과를 반영하는 것을 “트랜잭션 커밋”이라고 한다.
서비스에서의 트랜잭션 경계설정 → 트랜잭션 동기화
기술과 상관없는 트랜잭션 경계설정 코드 → 트랜잭션 서비스 추상화