본문 바로가기
trouble shooting/spring

@Transaction 오류

by 일상코더 2022. 12. 7.

미니 프로젝트와 클론 프로젝트 그리고 주특기 공부할때 기술멘토님들에게 계속 강조를 받았던 @Transaction에 관한 에러가 나왔다.

 

1. 문제 상황 

               

               - 변경 감지 기능을 사용해서 특정 데이터를 db에 저장하려고 했는데 계속 해서 db에 값이 저장이 안되었다.

               - 코드는 문제가 없다고 판단했지만 코드를 수정하는것 말고는 딱히 해결방법도 못찾았다.

 

 

트렌젝션 DB

 

변경 감지 기능 사용

 

위에서 분명히 member를 모두 불러왔고 그렇기때문에 변경 감지 기능을 사용하면 save하지 않아도 값이 잘 저장되어야 하는데 계속 db에 값이 저장되지 않았다.

 

 

2. 문제 원인

       

  조회하는 로직이라고 생각하고 @Transaction이 원래 빠져있었기 때문에 @Transaction(readOnly = true) 값이 적용되고있었던 것이다. 그래서 값이 수정이 되어도 읽기 전용이기 때문에 값이 제대로 저장되지 않았던 것이다.

 

 

 

3. 문제 해결

 

            - 문제 해결은 간단하게 해결되었다. @Transaction을 붙혀주면 되는것

 

 

해결하는것은 @Transaction 을 붙혀주면 그만 이었지만 이 것을 깨닳는 과정까지 걸린 시간은 몇일인지 계산이 안된다. 

기술 매니저님들 께서 중요하게 강조한 부분을 에러를 통해 집고 넘어가게 되어서 기분이 좋았던 것 같다. 

 

 

트랜잭션(Transaction)이란?

트랜잭션은 우리말로 ‘거래’라는 뜻을 갖고 있으므로, 먼저 거래와 관련된 간단한 예시를 들어보겠다.

어떤 사람과 거래를 하고 있는 상황이다.

  • 물건을 받기 위해 상대방에게 선입금을 했다.
  • 그런데 벽돌이 도착했다.

사기당한 사실을 깨닫고 나면, 시간을 되돌리고 싶지 않을까?

트랜잭션 개념은 이를 가능하게 한다.

상대방에게 입금하는 작업이 성공했더라도 원하던 물건을 받지 못했다면 입금이 취소되었을 것이다.

모든 작업들이 성공적으로 완료되어야 작업 묶음의 결과를 적용하고, 어떤 작업에서 오류가 발생했을 때는 이전에 있던 모든 작업들이 성공적이었더라도 없었던 일처럼 완전히 되돌리는 것이 트랜잭션의 개념이다.

데이터베이스를 다룰 때 트랜잭션을 적용하면 데이터 추가, 갱신, 삭제 등으로 이루어진 작업을 처리하던 중 오류가 발생했을 때 모든 작업들을 원상태로 되돌릴 수 있다. 모든 작업들이 성공해야만 최종적으로 데이터베이스에 반영하도록 한다.

 

댓글