일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 백준
- java
- JDBC
- QueryDSL
- 인프런
- Android
- Proxy
- springdatajpa
- jpa
- kotlin
- Spring Boot
- db
- 자바
- 스프링
- Servlet
- Exception
- transaction
- 스프링 핵심 원리
- 알고리즘
- pointcut
- 김영한
- AOP
- SpringBoot
- 스프링 핵심 기능
- JPQL
- 그리디
- Greedy
- http
- Thymeleaf
- spring
- Today
- Total
목록Lock (4)
개발자되기 프로젝트
일반적인 조회는 락을 사용하지 않는다 데이터베이스마다 다르지만, 보통 데이터를 조회할 때는 락을 획득하지 않고 바로 데이터를 조회할 수 있다. 예를 들어서 세션1이 락을 획득하고 데이터를 변경하고 있어도, 세션2에서 데이터를 조회는 할 수 있다. 물론 세션2에서 조회가 아니라 데이터를 변경하려면 락이 필요하기 때문에 락이 돌아올 때 까지 대기해야 한다. 조회와 락 데이터를 조회할 때도 락을 획득하고 싶을 때가 있다. 이럴 때는 select for update 구문을 사용하면 된다. 이렇게 하면 세션1이 조회 시점에 락을 가져가버리기 때문에 다른 세션에서 해당 데이터를 변경할 수 없다. 물론 이 경우도 트랜잭션을 커밋하면 락을 반납한다. 조회 시점에 락이 필요한 경우는 언제일까? 트랜잭션 종료 시점까지 해..
기본 데이터 입력 set autocommit true; delete from member; insert into member(member_id, money) values ('memberA',10000); lock 0 lock 1 - 세션1 set autocommit false; update member set money=500 where member_id = 'memberA'; 세션1이 트랜잭션을 시작하고, memberA 의 데이터를 500원으로 업데이트 했다. 아직 커밋은 하지 않았다. memberA 로우의 락은 세션1이 가지게 된다. lock 2 - 세션 2 SET LOCK_TIMEOUT 60000; set autocommit false; update member set money=1000 where..
세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션2에서 동시에 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다. 바로 트랜잭션의 원자성이 깨지는 것이다. 여기에 더해서 세션1이 중간에 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다. 이런 문제를 방지하려면, 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지 다른 세션에서 해당 데이터를 수정할 수 없게 막아야 한다. lock 0 세션1은 memberA 의 금액을 500원으로 변경하고 싶고, 세션2는 같은 memberA 의 금액을 1000원으로 변경하고 싶다. 데이터베이스는 이런 문제를 해결하기 위해 락(Lock)이라는 개념을 제공한다. lock 1 세션1은 트랜잭션을..
1. JPA Hint??? JPA 쿼리 힌트(SQL 힌트가 아니라 JPA 구현체인 hibernate에 제공하는 힌트) 2. 쿼리 힌트 사용 org.springframework.data.jpa.repository.QueryHints 어노테이션을 사용 "org.hiberante.readOnly"가 적용되면 해당 메서드에 대해 스냅샷 만들지 않고, 따라서 변경감지도 하지 않음. //org.hibernate.readOnly를 hiberante가 열어놨다! //readOnly가 적용되면 영속성 컨텍스트에 스냅샷 안만들어 놓음. @QueryHints(value= @QueryHint(name = "org.hibernate.readOnly", value = "true")) Member findReadOnlyByUser..