250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 유니크제약조건
- 스프링 폼
- 다대다
- querydsl
- PS
- 지연로딩
- execute
- JPQL
- 일대다
- 이진탐색
- CHECK OPTION
- shared lock
- eager
- SQL프로그래밍
- dfs
- fetch
- exclusive lock
- 연관관계
- BOJ
- 비관적락
- 다대일
- 백트래킹
- 데코레이터
- 즉시로딩
- FetchType
- 연결리스트
- 힙
- 낙관적락
- 스토어드 프로시저
- 동적sql
Archives
- Today
- Total
흰 스타렉스에서 내가 내리지
트랜잭션을 지원하는 "쓰기 지연"의 진짜 장점⭐️ 본문
728x90
- 트랜잭션을 지원하는 쓰기 지연과 변경 감지 기능 덕분에 성능과 개발의 편의성의 장점을 얻었다.
- 하지만 진짜 장점은 데이터베이스 row 에 lock 이 걸리는 시간을 최소화한다는 점이다.
- 이 기능은 트랜잭션을 커밋해서 영속성 컨텍스트를 플러시하기 전까지는 데이터베이스에 데이터를 등록, 수정, 삭제하지 않는다.
- 따라서 커밋 직전까지 데이터베이스 로우에 락을 걸지 않는다.
update(member); // UPDATE SQL A
logicA(); // UPDATE SQL ...
logicB(); // UPDATE SQL ...
commit();
- JPA 를 사용하지 않고 SQL 을 직접 다루면 update(member) 를 호출할 때 UPDATE SQL 을 실행하면서 데이터베이스 테이블 로우에 락을 건다.
- 이 락은 logicA(), logicB() 를 모두 수행하고 commit() 을 호출할 때까지 유지된다.
- 보통 데이터베이스에 현재 수정 중인 데이터를 수정하려는 다른 트랙잭션은 락이 풀릴 때까지 대기한다.
- JPA 는 커밋을 해야 플러시를 호출하고 데이터베이스에 수정 쿼리를 보낸다.
- 예제에서 commit() 을 호출할 때 UPDATE SQL 을 실행하고 바로 데이터베이스 트랜잭션을 커밋한다.
- 쿼리를 보내고 바로 트랜잭션을 커밋하므로 결과적으로 데이터베이스에 락이 걸리는 시간을 최소화한다.
- 사용자가 증가하면 서버를 증설하면 된다.
- 하지만 데이터베이스 락은 서버 증설만으로는 해결할 수 없다
- 오히려 서버를 증설해서 트랜잭션이 증가할수록 더 많은 데이터베이스 락이 걸린다.
- JPA 의 쓰기지연 기능은 데이터베이스에 락이 걸리는 시간을 최소화해서 동시에 더 많은 트랜잭션을 처리할 수 있는 장점이 있다.
'JPA' 카테고리의 다른 글
[Querydsl] ORDER BY RAND() 사용하기 (0) | 2024.05.05 |
---|---|
[JPA] ACID, 트랜잭션과 락 (2) | 2024.04.28 |
[JPA] 배치 처리 (1) | 2024.04.28 |
읽기 전용 쿼리의 성능 최적화 - @Transactional(readonly=true), setHint(readonly) (1) | 2024.04.28 |
[JPA] N+1 문제를 피할 수 있는 다양한 방법 (1) | 2024.04.28 |