🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

트랜잭션 질문입니다.

22.08.10 18:14 작성 조회수 229

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님의 프로필

codesweaver

2022.08.11

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

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

.

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


감사합니다.

채널톡 아이콘