GS2-Dictionary 트랜잭션 액션
액션의 조합과 동시 실행
모든 서비스에 공통되는 전제는 트랜잭션 액션의 조합에 정리되어 있습니다. 먼저 그쪽을 읽어 주십시오. 이 절의 나머지는 GS2-Dictionary 고유의 내용입니다.
GS2-Dictionary의 트랜잭션 액션은 네임스페이스와 사용자의 조합으로 결정되는 한 사용자의 도감, 즉 획득한 엔트리 목록을 대상으로 합니다. 엔트리의 추가·삭제는 이 목록을 통째로 다시 쓰는 형태로 반영됩니다.
| 조작 | 같은 행을 겹쳤을 때 | 중첩 너머 | 다른 대상이 되는 경계 |
|---|---|---|---|
엔트리의 추가AddEntriesByUserId | 통합되어 엔트리 이름이 중복을 제외하고 결합된다 | 실패한다 | 네임스페이스·사용자 |
엔트리의 삭제DeleteEntriesByUserId | 통합되어 엔트리 이름이 중복을 제외하고 결합된다 | 실패한다 | 네임스페이스·사용자 |
엔트리의 검증VerifyEntryByUserId | 먼저 지정한 쪽이 남음 | 읽기만 하므로 충돌하지 않는다 | 엔트리·검증 타입 |
추가와 삭제는 행이 다르고 경계가 같습니다. 하나의 도감에 대한 추가와 삭제를 같은 트랜잭션에서 수행할 수는 없습니다. 트랜잭션을 나누어 주십시오.
추가는 중복을 제거하여 통합되므로, 같은 엔트리가 여러 액션에 나타나도 됩니다. 100건의 상한도 중복을 제거한 뒤의 수로 판정됩니다.
추가와 삭제 중 어느 한쪽이 결과적으로 도감을 다시 쓰지 않은 경우, 예를 들어 추가 대상을 모두 이미 획득했거나 삭제 대상을 하나도 갖고 있지 않은 경우에는, 함께 두어도 트랜잭션이 성공할 수 있습니다. 실행 시점의 사용자 획득 상황에 좌우되므로, 이것을 전제로 설계하지 마십시오.
검증 액션은 트랜잭션 시작 시점의 도감을 봅니다. 같은 트랜잭션에서 추가한 엔트리를 have로 검증하거나, 삭제한 엔트리를 havent로 검증할 수는 없습니다.
중첩된 트랜잭션에 주의
나란히 작성하면 1건으로 통합되었을 추가끼리라도, 한쪽이 안쪽에서 도착하는 경우에는 트랜잭션이 실패합니다. 같은 엔트리를 양쪽 경로에서 추가한 경우도 마찬가지입니다.
제한을 회피하고 싶은 경우
엔트리의 추가는 획득 액션, 삭제는 소비 액션입니다. 안쪽에서 도착한 추가와의 충돌은 acquireActionUseJobQueue를 활성화하면 해소되지만, 추가와 삭제의 공존은 enableAtomicCommit을 비활성화하지 않으면 해소되지 않습니다.
동시 실행과 재시도
같은 사용자의 도감을 여러 요청이 동시에 업데이트한 경우, 나중에 확정된 쪽이 충돌(409)이 됩니다. 도감의 내용에 문제가 있는 것은 아니므로, 재시도하면 성공합니다.
같은 사용자에 대해 도감을 업데이트하는 요청을 짧은 시간에 병행하여 발행할수록 발생하기 쉬워집니다. 추가와 삭제를 하나의 트랜잭션으로 모으거나, 같은 사용자에 대한 업데이트를 직렬화하는 등의 대책이 유효합니다.
Verify Action
검증 액션
Gs2Dictionary:VerifyEntryByUserId
사용자 ID를 지정하여 엔트리 검증
지정한 사용자가 특정 엔트리를 수집했는지 여부를 검증합니다.
검증 타입으로 조건을 지정합니다:‘have’는 사용자가 엔트리를 보유하고 있는지 확인하고, ‘havent’는 보유하고 있지 않은지 확인합니다.
검증에 실패한 경우, 오류가 반환됩니다.
수량 지정 가능한 액션: 아니오
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||||||||
| entryModelName | string | ✓ | ~ 128자 | 엔트리 모델 이름 엔트리 모델 고유 이름입니다. 영숫자 및 -(하이픈), _(언더스코어), .(마침표)로 지정합니다. | ||||||||
| verifyType | 문자열 열거형 enum { “havent”, “have” } | ✓ | 검증 종류
| |||||||||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2Dictionary:VerifyEntryByUserId",
"request": {
"namespaceName": "[string]네임스페이스 이름",
"userId": "[string]사용자ID",
"entryModelName": "[string]엔트리 모델 이름",
"verifyType": "[string]검증 종류",
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2Dictionary:VerifyEntryByUserId
request:
namespaceName: "[string]네임스페이스 이름"
userId: "[string]사용자ID"
entryModelName: "[string]엔트리 모델 이름"
verifyType: "[string]검증 종류"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("dictionary").verify.verify_entry_by_user_id({
namespaceName="[string]네임스페이스 이름",
userId="[string]사용자ID",
entryModelName="[string]엔트리 모델 이름",
verifyType="[string]검증 종류",
timeOffsetToken="[string]타임 오프셋 토큰",
})Consume Action
소비 액션
Gs2Dictionary:DeleteEntriesByUserId
사용자 ID를 지정하여 엔트리 삭제
엔트리 모델 이름의 목록을 지정하여, 지정한 사용자의 도감에서 특정 엔트리를 삭제합니다.
일괄 작업으로 여러 엔트리를 한 번에 삭제할 수 있습니다.
반환되는 목록에는 실제로 삭제된 엔트리가 포함됩니다.
수량 지정 가능한 액션: 아니오
반전 가능한 액션: 예
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||
| entryModelNames | List<string> | [] | 0 ~ 100 items | 엔트리 모델 이름 목록 | ||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2Dictionary:DeleteEntriesByUserId",
"request": {
"namespaceName": "[string]네임스페이스 이름",
"userId": "[string]사용자ID",
"entryModelNames": [
"[string]엔트리 모델 이름"
],
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2Dictionary:DeleteEntriesByUserId
request:
namespaceName: "[string]네임스페이스 이름"
userId: "[string]사용자ID"
entryModelNames:
- "[string]엔트리 모델 이름"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("dictionary").consume.delete_entries_by_user_id({
namespaceName="[string]네임스페이스 이름",
userId="[string]사용자ID",
entryModelNames={
"[string]엔트리 모델 이름"
},
timeOffsetToken="[string]타임 오프셋 토큰",
})Acquire Action
입수 액션
Gs2Dictionary:AddEntriesByUserId
사용자 ID를 지정하여 엔트리 등록
지정한 사용자의 도감에 하나 이상의 엔트리를 등록합니다.
일괄 작업으로 여러 엔트리 모델 이름을 한 번에 지정할 수 있습니다.
이미 등록된 엔트리는 오류 없이 건너뜁니다.
반환되는 목록에는 새로 추가된 엔트리만 포함됩니다.
수량 지정 가능한 액션: 아니오
반전 가능한 액션: 예
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| userId | string | ✓ | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | ||
| entryModelNames | List<string> | [] | 0 ~ 100 items | 엔트리 모델 이름 목록 | ||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2Dictionary:AddEntriesByUserId",
"request": {
"namespaceName": "[string]네임스페이스 이름",
"userId": "[string]사용자ID",
"entryModelNames": [
"[string]엔트리 모델 이름"
],
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2Dictionary:AddEntriesByUserId
request:
namespaceName: "[string]네임스페이스 이름"
userId: "[string]사용자ID"
entryModelNames:
- "[string]엔트리 모델 이름"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("dictionary").acquire.add_entries_by_user_id({
namespaceName="[string]네임스페이스 이름",
userId="[string]사용자ID",
entryModelNames={
"[string]엔트리 모델 이름"
},
timeOffsetToken="[string]타임 오프셋 토큰",
})