티스토리 뷰

 

 

JPA를 사용해 DB insert를 하던 중 뜬금없이 아래와 같은 에러가 났다.

java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement

 

흠 DB가 어떤 이유에서인지 read-only 설정이 되어 있군.

 

인프라 개발자에게 연락해야지.

 

 

 

라고 끝났으면 좋았겠지만, 인프라는 DB 설정을 변경한게 없다고 한다.

 

웃긴건, 같은 프로젝트의 다른 서비스 내에서의 DB insert는 정상적으로 수행되고 있다는 점이다.

 

다른 서비스와 차이점을 뜯어보던 중

 

@Transactional 이 빠져 있는걸 확인했다.

 

@Transactional 어노테이션을 붙이니까 정상 동작했다.

 

그런데 내가 기억하기론 @Transactional은 DB가 read-only로 설정 되어 있는 걸 해제해주는 역할 같은건 하지 않는다.

 

그래서 조금 더 알아봤다.

 

@Transactional 의 역할

 

1. 트랜잭션 시작 : @Transactional 어노테이션이 적용된 메서드가 호출되면, AOP기반으로 구현된 트랜잭션 매니저(Transaction Manager)를 통해 트랜잭션을 생성하고, 데이터베이스 커넥션을 확보한다.

2. 트랜잭션 경계 설정 : 메서드 실행 전에 트랜잭션을 시작하고, 메서드 실행이 완료되면 트랜잭션을 커밋 또는 롤백한다. 이를 통해 데이터베이스 작업이 원자적으로 처리되고, 트랜잭션의 일관성을 보장한다.

3. 예외 처리와 롤백 : 메서드 실행 중에 예외가 발생하면 트랜잭션을 롤백한다. 이를 통해 데이터 일관성과 안정적인 트랜잭션 처리를 보장한다.

4. 트랜잭션 종료 : 메서드의 실행이 완료되면, AOP를 통해 트랜잭션을 종료한다. 이때 트랜잭션 매니저는 데이터베이스 커넥션을 반환하고, 트랜잭션을 정리한다.

 

@Transactional은 트랜잭션을 정리하는 역할을 하는데, 역시나 DB의 설정을 건드리는 역할을 하지 않는다.

 

대체 왜 이 어노테이션을 붙이면 해결된걸까?

 

그렇다면 insert 쿼리가 문제인걸까?

 

JPA의 save

save 매서드는 디폴트로 @Transactional이 붙어있다.

 

@Transactional의 디폴트는 readonly = false기 때문에 이 이유는 당연히 아니다.

 

 

 

일단은 해결됐으니 넘어가지만

 

아직까지 문제가 발생한 이유와 해결된 이유를 못 찾았는데, 이유를 좀 알고 싶다...

 

yaml에 작성된 DB 설정을 봐도 별다른 추가 옵션이 없다.

 

이 에러가 어떤 이유에서 발생했는지는 조금 더 뜯어봐야 될 것 같다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함