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문 실행이 되지 않음
@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()
);
}
이제 데이터가 잘 들어온다.