게임 저장 시 동일한 gamer_id 로 생성된 데이타가 2개 이상 존재하는 문제

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.5.0
  • 프로젝트명 : KnightRush
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

전체 테이블의 정보가 다 그런건 아니고 일부 테이블에서만 현재 발생하고 있는 문제인데요, 동일한 gamer_id 의 데이타가 여럿 생성되어 있습니다. 정확히는 동일한 gamer_id 당 데이타가 4개씩 생성되어 있고, inDate 값은 모두 다릅니다. owner_inDate 값은 모두 동일합니다.
칼럼개수만큼 있는 것 같습니다 .칼럼마다 따로 따로 저장이 되어 있네요.
저장을 잘못한 문제일까요?

안녕하세요 개발자님.

기존 로직에서는 한 아이디당 하나의 row만 가지고 있었는데, 특정 유저만 한 아이디에 여러 row를 가지고 있다는 말씀이실까요?
해당 사항이라면 특정 유저가 row가 존재하는지 확인하는 로직 혹은 업데이트 하는 로직에서 row가 있음에도 어떠한 이유로(서버와의 연결이 원활하지 못할때 일어나는 400, 502 에러) 실패하여 Insert가 되었을 가능성이 있습니다.

아래와 같은 에러들 또한 로직에서 예외처리를 하는지 확인해주시면 감사하겠습니다.

  • 한 클라이언트(동일 ip)에서 너무 많은 요청을 보낸 경우
    해당 에러가 발생한 클라이언트는 5분 동안 요청을 보낼 수 없습니다.
    statusCode : 403
    errorCode : Forbidden
    message : 403 Forbidden

  • 네트워크의 상태가 일시적으로 불안정하여 호출/응답에 실패할 경우
    statusCode : 400
    errorCode : HttpRequestException
    message : An error occurred while sending the request (2)
    Error getting response stream (ReadDone2): ReceiveFailure

  • 네트워크의 상태가 일시적으로 불안정하여 호출/응답에 실패할 경우2
    statusCode : 502
    errorCode : BadGateWay

예를 들어 Item 이라는 테이블에 Weapon, Costume 가 들어가 있다고 할 때, Weapon, Costume 이 각각의 칼럼을 가지고 있는 상황인데, 저장을 할 때, Weapon, Costume을 한번에 하는게 아니라, Weapon 저장 한번 요청하고, Costume 한번 요청하고 해서 두 번의 요청을 하고 있는 상황입니다.

근데 ganmer_id 가 칼럼 개수당 중복되어 생기면서, Weapon 칼럼을 가진 데이타가 하나 생기고, Costume 칼럼을 가진 데이타가 하나 또 생겨서 2개의 데이타가 생기는 문제가 발생해서, 유저가 다시 데이타를 로드 했을 경우 둘중에 하나의 데이터만을 가지고 오게 되어 일부 데이타가 없어진 현상을 보게되는거죠.

기존에는 저장을 순차적으로 해서 문제가 없었는데, 강제종료 시 저장처리를 하면서 패킷을 한꺼번에 보내게 되었는데, 이로 인해 동시에 같은 gamer_id 를 가진 데이타가 여러개가 생긴게 아닐까 싶습니다.

그래서 패킷을 한꺼번에 보낼 때 이러한 일이 발생할 가능성이 있는지 여쭤보고 싶습니다. 서버 연결이 원활하지 않아 insert 가 되었을 가능성도 있겠네요. 근데 insert 가 된다고 해도, 서로 다른 데이타에 중복된 gamder_id 가 복수개의 데이타가 생길 수 있는건가요?

현재 이러한 문제로 모든 유저에게 같은 현상이 발생한 상황이긴 합니다 .

테스트해보니 같은 테이블에 insert 를 여러번 호출해서 발생하는 문제같네요. 같은 테이블에 insert 를 여러번 할 경우 중복된 데이타가 여러개 생길 수 있는 건가요?

즉, item 테이블에 weapon 칼럼에 데이타 insert, 그리고 다시 item 테이블에 costume 칼럼에 데이타 insert 이렇게 해서 중복된 2개의 데이타가 생성된 것 같습니다.

동일한 param으로 Insert함수를 두번 호출하면 해당 테이블에 데이터 존재 여부 상관없이 동일한 데이터가 두개 생성됩니다.

Backend.GameData.Insert는 무조건 row를 하나 생성하게 되고, 한 테이블에 한명의 유저가 여러 개의 row를 가지는 것도 가능합니다.

게임 시작시에 해당 테이블에 Backend.GameData.GetMyData(“tableName”,new Where()) 함수를 이용해 데이터가 존재하는지 확인 후, 존재하면 update, 존재하지 않으면 insert하는 방법을 이용하는 것을 권장드립니다.

네 답변 감사드립니다.