스프링 게시판 insert 문제 0 15 4,124

by 풋사과 [2013.11.21 11:19:21]



글등록 할때
본문작성폼이랑
추가작성폼이 따로있는데
등록시 서로 다른 테이블로 들어갑니다.
스프링+마이바티스

본문 글은 시퀀스로 저장이됩니다.
INSERT INTO GAME1(TEST_SEQ)
VALUES(GAME_SEQ.NEXTVAL)
추가작성글은
INSERT INTO GAME2(TEST_SEQ)
VALUES(#TEST_SEQ#)
쿼리는 이렇게 되어있는데

혼자서 작성시는 이상이 없는데
글등록할때 누군가 글작성을 하게된다면
시퀀스 값이 바뀌어서 추가로 작성한 글이
다른 게시물에 등록이 됩니다

소스가 복잡해서 크게바뀌기는 무리가 있어서요
어떻게 해결하면 좋을까요?

추가
GAME2 에서 TEST_SEQ을 값을 불러들일때 이 밑에 쿼리를 통해서가져오네요;;

 SELECT TO_CHAR(MAX(TO_NUMBER(TEST_SEQ))) AS TEST_SEQ  
FROM   GMAE1
값을 받아올때 이부분으 바꿔주면 되지않을까요?
by 김실홍 [2013.11.21 11:24:06]

이건 쿼리 문제가 아니라 설계나 로직문제인듯 하네요

추가 작성글이 덧글 같은건가요?



by 풋사과 [2013.11.21 13:15:03]

덧글은 아닌데 프로그램 돌아가는걸 보면..그렇네요
본글에 추가글이 들어가니깐 문제는 등록 한번에 둘다 insert 되는거죠
본글 등록이되고 다시 들어가서 해당글의 본문글과 추가글을 수정
추가글이 이상없이 들가요


by 아발란체 [2013.11.21 11:32:06]
ㅡ ㅁ ㅡ)ㆀ 실홍님 말씀처럼 로직이 잘못 된 것 같습니다.

위에 추가 글 작성 할 때는 시퀸스를 쓰지 않고 test_seq라는 값으로 바인딩하고 있는데
이 값은,
본문 글 읽고 관련 추가 글 작성하기 할 때!!
본문 글에 해당하는 GAME1 테이블 키 값으로 사용이 보장 되도록 해야 합니다.
또한 이런 상황에 본문 키 값은 어떤 경우에도 수정이 되면 안 되며,
사용자가 동시에 많이 쓰는 것과 관계 없이 로직이 이런 부분이 충분히 고려되지 않은 것 같습니다.
즉 트렌젝션 문제라고 보기는 어려운 것 같습니다.

소스가 복잡해도 J2EE 소스 레벨에서 수정이 불가피한 상황 같습니다.
이것을 쿼리나 MyBatis 로직으로 풀려고 하면 더 골치 아픈 상황이 생길 수 있습니다.

by 풋사과 [2013.11.21 13:15:51]

제가 만들었으면 이렇게 안만들었을텐데...


by 우리집아찌 [2013.11.21 11:43:04]

프로시져..

by 풋사과 [2013.11.21 13:16:45]
잘안써봐서ㅡ0ㅡ 되긴되는건가요??
프로시져을 써도 소스수정은 불가피할걸로 보이네요;

by 마농 [2013.11.21 16:01:32]
본글 추가글 동시 들어갈땐
추가글엔 GAME_SEQ.CURRVAL 사용하세요.

by 우리집아찌 [2013.11.21 16:10:54]
그사이에 다른글 들어가면요?

by 용근님 [2013.11.21 17:11:32]

한 세션에서 nextval 한 Current한 값을 가지고 있기 때문에 상관없어요~


by 우리집아찌 [2013.11.21 17:23:54]

그런군요.. 지금까지 잘못알고있었군요...


by 우리집아찌 [2013.11.21 18:06:11]

지금 테스트 했는데 재밌군요..
이좋은 방법을 지금알았다니.. ㅎㅎ


by 풋사과 [2013.11.22 15:47:31]
될줄알았는데 세션문제나네요 모르겠어요ㅠㅠ


org.springframework.jdbc.UncategorizedSQLException
예외 메시지 : SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [72000]; error code [8002]; --- The error occurred in game/dao/ibatis/GameList.xml. --- The error occurred while applying a parameter map. --- Check the insertContGameList-InlineParameterMap. --- Check the statement (update failed). --- Cause: java.sql.SQLException: ORA-08002: sequence GAME_SEQ.CURRVAL is not yet defined in this session ; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException: --- The error occurred in game/dao/ibatis/GameList.xml. --- The error occurred while applying a parameter map. --- Check the insertContGameList-InlineParameterMap. --- Check the statement (update failed). --- Cause: java.sql.SQLException: ORA-08002: sequence GAME_SEQ.CURRVAL is not yet defined in this session

by 마농 [2013.11.22 15:59:37]
currval 은 nextval 을 한 세션에서만 사용할 수 있습니다.
해당 오류는 nextval 안한 상태에서 currval 해서 나는 오류입니다.

by 러드 [2013.11.21 18:55:35]
nextval값을 먼저 조회해서 결과 seq값을 리턴 받은 다음에 저장 하세요!!

그럼 max로 값도 안 찾아와도 되고!!

등록화면을 close 안 하고도 없무 진행이 된다고 생각이 드네요!!

by 풋사과 [2013.11.28 11:06:36]

ㅠ_ㅠ 머리가 안돌아감;;;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입