작성
·
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 등을 사용할 수 있습니다.
감사합니다.