영속성 컨텍스트 동시성...? 관련 질문입니다
333
작성한 질문수 7
em.flush를 명시적으로 적어주거나, 트랜잭션이 끝나서 커밋이 될 때 DB에 쿼리를 날리는 JPA에 관해서 궁금한게 있습니다.
DB 제약은 복합키로 되어있고 insert 하는 상황에서 궁금증이 있는데요
동일한 복합키를 가진건 DB쿼리를 그대로 날려도 Exception을 뱉어서 실제 DB에는 들어가지 않는다는 것은 알고 있습니다.
다만 궁금한게 순수히 오로지 JPA로만 해결이 가능한 문제인지 궁금증이 있습니다.
id와 name은 사용자로 부터 요청 받은 부분이고
Member requetMember = new Member(id,name);
Optional<Member> m = repository.findByIdAndName(id,name);
if(m.isPresent()){
repository.insert(requestMember);
}
제가 궁금한 상황은 멀티서버 환경에서 실행 되는 쓰레드가 2개 있다고 했을때
동시에 2번의 요청을 보내고 2개 모두 예외는 발생하지 않아야 하는 상황입니다.
A,B 쓰레드 모두 m.isPresent() 코드를 통과 하였고
그 와중에 A 쓰레드가 실행될때, insert까지 마치고 트랜잭션 커밋까지 이루어진 상황에서
B쓰레드가 repository.insert(requestMember);
이 부분을 실행 할 때 에러가 나는걸 방지 할 수 있는지 궁금합니다.
JPA로 해보려다 딱히 방안이 생각나지 않아서
insert 할 때 sql로
insert into member
select id , name
where not exist(select * from member where id='id', name='name')
이런식으로 insert 할 때 select를 1번의 쿼리로 하면서 하고있는데요, 이런 경우는 어떻게 해야할까요?
답변 1
0
안녕하세요. ariwarabbang님
이 경우는 JPA로 막을 수 없습니다. 대신에 데이터베이스 제약조건 때문에 예외가 발생하게 됩니다.
데이터베이스 예외를 확인하시고, 해당 예외가 발생할 때 예외를 잡아서 후처리 하는 방식을 사용해야 합니다.
추가로 다음 내용도 읽어보시면 도움이 되실거에요.
https://www.inflearn.com/questions/59250
감사합니다.
inheritance startegy 선택시 고려사항
0
11
0
Entity 동등성 비교
0
14
1
실무 조언 관련 질문입니다.
0
41
1
H2데이터베이스 파일 생성
0
52
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
49
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
48
1
JPQL 메소드와 락
0
53
1
Delivery @OneToOne
0
57
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
89
2
UnsupportedOperationException 발생
0
82
3
H2 Database 연결이 안됩니다.
0
89
2
연관관계 매핑 질문드립니다.
0
82
2
h2데이터베이스 실행오류
0
105
2
persistence.xml
0
103
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
77
1
영속성 컨텍스트
0
62
1
JPA 프록시
0
90
1
Native Query와 MyBatis
0
63
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
84
1
임베디드 타입 예시 코드 관련 질문
0
112
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
91
3
인텔리제이 패키지 커서 단축키 질문
0
106
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
137
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
68
1





