org.springframework.orm.jpa.JpaSystemException: could not execute statement Connection is read-only

한지연·2023년 7월 13일
0

SQL Error: 0, SQLState: S1009
Connection is read-only. Queries leading to data modification are not allowed
Resolved [org.springframework.orm.jpa.JpaSystemException: could not execute statement [Connection is read-only. Queries leading to data modification are not allowed] [insert into ChatText (chatting_text,chatting_id,createDate,user_no) values (?,?,?,?)]]

문제상황

jpa insert문 실행이 되지 않음


code

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ChattingService {


    private final ChattingRepository chattingRepository;


    private final ChatTextRepository textRepository;

    private final UserRepository userRepository;


    public List<ChattingInfoDto> myChattingList(@PathVariable("userId") String userId){

        User findUser = userRepository.findByUserStrId(userId);

        if(findUser == null) throw new UserNotFoundException("유저 정보를 찾을 수 없습니다.");


        return chattingRepository.myMeetingList(findUser.getId());
    }


    public void isValid(Long meetingId) {

         chattingRepository.findById(meetingId).orElseThrow(IllegalArgumentException :: new);
    }

    public void sendMessages(Long chattingId, String userId, TextDto textDto) {

        Chatting chatting = chattingRepository.findById(chattingId).orElseThrow(IllegalArgumentException::new);
        User findUser = userRepository.findByUserStrId(userId);

        if(findUser == null) throw new UserNotFoundException("유저 정보를 찾을 수 없습니다.");

        textRepository.save(
                ChatText.builder()
                        .user(findUser)
                        .chatText(textDto.getMessages())
                        .chatting(chatting)
                        .build()

        );

    }
}

원인 파악

기본적으로 서비스단은 transactional(readOnly=true)로 설정한다. 그리고 트랜잭션 내에서 db 데이터를 변경해야 하는 경우에만 해당 메소드에 @Transactional을 설정해줘야 한다. 그런데 지금 내가 요청한 부분에 해당 어노테이션이 없다.


문제 해결

    @Transactional
    public void sendMessages(Long chattingId, String userId, TextDto textDto) {

        Chatting chatting = chattingRepository.findById(chattingId).orElseThrow(IllegalArgumentException::new);
        User findUser = userRepository.findByUserStrId(userId);

        if(findUser == null) throw new UserNotFoundException("유저 정보를 찾을 수 없습니다.");

        textRepository.save(
                ChatText.builder()
                        .user(findUser)
                        .chatText(textDto.getMessages())
                        .chatting(chatting)
                        .build()

        );

    }

이제 데이터가 잘 들어온다.

profile
배우고 활용하는 것을 즐기는 개발자, 한지연입니다!

0개의 댓글