인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

이용준님의 프로필 이미지
이용준

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

트랜잭션 - 적용1

트랜잭션 질문입니다.

작성

·

284

0

트랜잭셔널 어노테이션 잘 쓰다가 갑자기 혼란이 와서요..

void updateName(string id){

   person=repo.findById(id)

   person.setName() // 변경 감지에 의한 update 쿼리

}

이런경우에 트랜잭셔널 걸어줄 필요가 없다는 글을 봐서 혼란이 옵니다..

제가 생각했을때는

findById로 조회하고--1
setName으로 변경--2

여기서 1이 실행됐을때
다른 트랜잭션B가 침투해서 해당 데이터를 임의로 바꿔주고 커밋까지 하면 
2가 실행되는 순간 트랜잭션B가 그냥 무시되는것 아닌거 생각했어요.
그래서 1,2는 무조건 atomic하게 연결되어야된다 생각을했는데..

그래서 꼭 @Transactional 을 해줘야 한다고 생각했는데 아니라면 그 이유가 궁금합니다!

답변 1

1

안녕하세요, 이용준 님! 공식 서포터즈 codesweaver 입니다.

트랜잭션 B가 먼저 commit 되었다는 먼저 수정요청을 했다는 뜻이 됩니다. 그래서 B가 먼저 데이터베이스에 반영된 후 트랜잭션  A의 값을 데이터베이스에 다시 반영합니다. 트랜잭션이 없다고 생각하더라도 결과는 같습니다. 그런 맥락에서 트랜잭션이 없어도 된다고 이야기 한것 같습니다.

.

값의 업데이트나 삭제는 경우에 따라 순서에 민감하지 않은 경우도 있습니다.문제는 조회할 때 어떤 값이 보여지는지가 중요하겠지요. 만약 트랜잭션 A가 값을 조회한 이후 다른 트랜잭션에서 이 값을 조회할 수 없도록 하고 싶다면 그 또한 가능합니다. 이때는 exclusive lock 등을 사용할 수 있습니다.


감사합니다.

이용준님의 프로필 이미지
이용준

작성한 질문수

질문하기