GS2-SkillTree 트랜잭션 액션
액션의 조합과 동시 실행
모든 서비스에 공통되는 전제는 트랜잭션 액션의 조합에 정리되어 있습니다. 먼저 그쪽을 읽어 주십시오. 이 절의 나머지는 GS2-SkillTree 고유의 내용입니다.
GS2-SkillTree의 트랜잭션 액션은 네임스페이스·사용자·프로퍼티의 조합으로 결정되는 하나의 스테이터스를 대상으로 합니다. 스테이터스는 스킬 트리의 어떤 노드를 해방했는지를 기록하는 것으로, 업데이트할 때마다 전체가 다시 쓰입니다.
| 조작 | 같은 행을 겹쳤을 때 | 중첩 너머 | 다른 대상이 되는 경계 |
|---|---|---|---|
노드의 해방MarkReleaseByUserId | 통합되어 노드 이름이 중복을 제외하고 결합된다 | 실패한다 | 네임스페이스·사용자·프로퍼티 |
노드의 억제MarkRestrainByUserId | 통합되어 노드 이름이 중복을 제외하고 결합된다 | 실패한다 | 네임스페이스·사용자·프로퍼티 |
노드의 해방에는 그 노드가 필요로 하는 것의 지불이 따르며, 억제하면 그것이 반환됩니다. 이러한 지불과 반환은 자신의 트랜잭션으로 발행되므로, 그것들이 속한 서비스의 제한을 받습니다.
반환은 지불로부터 도출됩니다. 해방의 소비 액션 하나하나가 그것을 취소하는 획득 액션으로 변환됩니다. 리셋은 해방된 노드를 한꺼번에 처리하므로, 서로 다른 노드에서 도출된 반환이 하나의 트랜잭션에 모입니다. 예를 들어 두 노드가 같은 미션 그룹의 다른 태스크에 대한 Gs2Mission:ReceiveByUserId를 필요로 하는 경우, 그 반환들이 충돌하여 억제나 리셋이 실패합니다.
전제 관계가 없는 노드를 여러 개 해방하기만 한다면, 하나의 액션의 nodeModelNames에 나열하여 지정해도, 액션을 여러 개 지정하여 통합시켜도 상관없습니다.
전제 관계가 있는 노드를 함께 해방하려면 하나의 액션으로 묶어야 합니다. 노드의 해방은 그 전제가 되는 노드가 이미 해방되어 있는지를 확인하는데, 이 판정이 트랜잭션 시작 시점의 스테이터스에 대해 이루어지기 때문입니다. 액션을 두 개로 나누면 전제 노드를 해방한 것이 다른 한쪽에서는 보이지 않습니다.
해방과 억제는 행이 다르고 경계가 같습니다. 하나의 트랜잭션에서 수행할 수는 없습니다. 트랜잭션을 나누어 주십시오.
프로퍼티가 다르면 다른 스테이터스이므로, 여러 프로퍼티의 노드를 하나의 트랜잭션에서 해방하는 것은 문제없습니다.
중첩된 트랜잭션에 주의
나란히 작성하면 1건으로 통합되었을 같은 스테이터스에 대한 해방끼리라도, 한쪽이 안쪽에서 도착하는 경우에는 트랜잭션이 실패합니다.
제한을 회피하고 싶은 경우
노드의 해방은 획득 액션, 억제는 소비 액션입니다. 해방끼리의 충돌은 acquireActionUseJobQueue를 활성화하면 해소되지만, 해방과 억제의 공존은 enableAtomicCommit을 비활성화하지 않으면 해소되지 않습니다. 전제 관계가 있는 노드를 함께 해방하고 싶은 경우에는, 어느 설정을 사용하든 하나의 액션으로 묶는 것이 확실합니다.
동시 실행과 재시도
같은 스테이터스를 여러 요청이 동시에 업데이트한 경우, 나중에 확정된 쪽이 충돌(409)이 됩니다. 요청 내용에 문제가 있는 것은 아니므로, 재시도하면 성공합니다. 재시도 시에는 최신 스테이터스에 대해 전제 조건이 다시 확인됩니다.
다른 프로퍼티의 노드를 동시에 해방하는 경우에는 충돌하지 않습니다.
Consume Action
소비 액션
Gs2SkillTree:MarkRestrainByUserId
사용자 ID를 지정하여 노드의 해방 상태를 미해방화
지정된 노드가 구속 가능한지 검증한 후(의존하는 노드가 해방 상태가 아니어야 합니다), 미해방으로 마크합니다.
수량 지정 가능한 액션: 아니오
반전 가능한 액션: 예
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||
| propertyId | string | ✓ | ~ 1024자 | 프로퍼티 ID 사용자마다 여러 개의 독립된 스킬트리 인스턴스를 가지기 위한 식별자입니다. 동일한 네임스페이스 내에서 플레이어가 서로 다른 캐릭터나 컨텍스트에 대해 별도의 스킬트리를 가지는 시나리오를 구현합니다. 최대 1024자. | ||
| nodeModelNames | List<string> | ✓ | 1 ~ 1000 items | 노드 모델 이름 목록 | ||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2SkillTree:MarkRestrainByUserId",
"request": {
"namespaceName": "[string]네임스페이스 이름",
"userId": "[string]사용자ID",
"propertyId": "[string]프로퍼티 ID",
"nodeModelNames": [
"[string]노드 모델명"
],
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2SkillTree:MarkRestrainByUserId
request:
namespaceName: "[string]네임스페이스 이름"
userId: "[string]사용자ID"
propertyId: "[string]프로퍼티 ID"
nodeModelNames:
- "[string]노드 모델명"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("skillTree").consume.mark_restrain_by_user_id({
namespaceName="[string]네임스페이스 이름",
userId="[string]사용자ID",
propertyId="[string]프로퍼티 ID",
nodeModelNames={
"[string]노드 모델명"
},
timeOffsetToken="[string]타임 오프셋 토큰",
})Acquire Action
입수 액션
Gs2SkillTree:MarkReleaseByUserId
사용자 ID를 지정하여 해방된 노드 기록
지정된 노드가 해방 가능한지 검증한 후(전제 노드가 이미 해방되어 있어야 합니다), 해방됨으로 마크합니다.
수량 지정 가능한 액션: 아니오
반전 가능한 액션: 예
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||
| propertyId | string | ✓ | ~ 1024자 | 프로퍼티 ID 사용자마다 여러 개의 독립된 스킬트리 인스턴스를 가지기 위한 식별자입니다. 동일한 네임스페이스 내에서 플레이어가 서로 다른 캐릭터나 컨텍스트에 대해 별도의 스킬트리를 가지는 시나리오를 구현합니다. 최대 1024자. | ||
| nodeModelNames | List<string> | ✓ | 1 ~ 1000 items | 노드 모델 이름 목록 | ||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2SkillTree:MarkReleaseByUserId",
"request": {
"namespaceName": "[string]네임스페이스 이름",
"userId": "[string]사용자ID",
"propertyId": "[string]프로퍼티 ID",
"nodeModelNames": [
"[string]노드 모델명"
],
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2SkillTree:MarkReleaseByUserId
request:
namespaceName: "[string]네임스페이스 이름"
userId: "[string]사용자ID"
propertyId: "[string]프로퍼티 ID"
nodeModelNames:
- "[string]노드 모델명"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("skillTree").acquire.mark_release_by_user_id({
namespaceName="[string]네임스페이스 이름",
userId="[string]사용자ID",
propertyId="[string]프로퍼티 ID",
nodeModelNames={
"[string]노드 모델명"
},
timeOffsetToken="[string]타임 오프셋 토큰",
})