여러 메서드 호출이 한 트랜잭션에 묶이도록 하기 위해 필요
@Transactional
을 이용해 메서드 간에 커넥션 객체를 전달하지 않아도 한 트랜잭션으로 묶어서 실행@Transactioal
public void createMember(){
if(checkMember){
insertMember(userInfo);
}
...
}
public boolean checkMember(String userId){
UserInfo signUserInfo = userRepository.findByUserId(userSignUpRequest.getUserId());
if(signUserInfo == null){
return false;
}else{
return true;
}
}
public void insertMember(UserInfo userInfo){
userRepository.save(userInfo);
}
동시성 문제와 격리 수준을 이해하면 문제 발생을 줄일 수 있음
잠금 시간은 최소화 (잠금 시간이 길어지면 성능 저하)
동시성 문제를 다룰 때는 사용하는 DB의 기본 격리 레벨확인, DB의 격리 레벨 동작 방식확인(DB마다 동작 방식이 다를수 있다.)
경쟁 상태(Race Condition)
여러 클라이언트가 같은 데이터에 접근할 때 문제 발생
트랜잭션 격리(Isolation)
가장 쉬운 방법은 트랜잭션을 순서대로 실행
다양한 격리 수준 지원
* Read Uncommitted
* Serializable
* 인덱스 잠금이나 조건 기반 잠금 사용
동시성 관련 문제들
커밋되지 않은 데이터 읽을때
커밋되지 않은 데이터 덮어쓰 기
읽는 동안 데이터 변경
변경 유실
변경 유실 처리 방법
원자적 연산 사용
명시적인 잠금
CAS(Compare And Set)
최범규님 - 프로그래밍 초식 : DB 트랜잭션 조금 이해하기 01 격리
[최범규님 - 프로그래밍 초식 : DB 트랜잭션 조금 이해하기 02 격리](