GS2-Script 트랜잭션 액션
액션의 조합과 동시 실행
모든 서비스에 공통되는 전제는 트랜잭션 액션의 조합에 정리되어 있습니다. 먼저 그쪽을 읽어 주십시오. 이 절의 나머지는 GS2-Script 고유의 내용입니다.
GS2-Script가 트랜잭션에 지정할 수 있는 액션은 1가지입니다. GS2-Script 자체는 사용자별 상태를 갖지 않으므로, 이 액션이 GS2-Script를 이유로 다른 것과 충돌하는 일은 없습니다. 무엇과 충돌할 수 있는지는 스크립트가 무엇을 하는지에 따라 결정됩니다.
| 조작 | 같은 행을 겹쳤을 때 | 중첩 너머 | 다른 대상이 되는 경계 |
|---|---|---|---|
스크립트의 실행InvokeScript | 통합되지 않고 각각 독립적으로 실행된다 | 통합되지 않고 각각 독립적으로 실행된다 | (각각의 실행이 항상 독립) |
스크립트·사용자·인수·난수 시드가 완전히 같은 실행을 여러 개 지정한 경우에도 각각 독립적으로 실행됩니다. 다만 acquireActionUseJobQueue를 활성화하여 작업 큐 경유로 실행하는 경우에는 완전히 같은 실행이 한 번으로 통합될 수 있습니다.
제한은 스크립트가 하는 일에서 비롯됩니다
스크립트가 기록한 것은 그것을 호출한 트랜잭션에 들어갑니다. 그 때문에 그 액션을 직접 지정한 경우와 완전히 같은 방식으로, 스크립트가 건드리는 서비스의 제한이 해당됩니다. 두 실행이 모두 같은 지갑에 가산하거나, 모두 같은 도감을 다시 쓰는 경우에는 그러한 액션을 나란히 작성했을 때와 같은 제한에 부딪힙니다.
어떤 리소스를 건드리는 것이 트랜잭션 안에서 그 스크립트뿐이라면, 지금까지의 이야기는 관계없습니다. 주의가 필요한 것은 같은 리소스를 트랜잭션에 직접 지정한 액션이나 다른 스크립트도 건드리는 경우입니다.
스크립트가 자신의 트랜잭션을 발행하는 경우에는 중첩이 되어 아래의 내용이 해당됩니다.
중첩된 트랜잭션에 주의
안쪽 트랜잭션에서 도착하는 업데이트는 바깥쪽에 직접 지정한 액션의 대상이 아닙니다. 그 때문에 바깥쪽 트랜잭션도 기록하는 리소스에 스크립트가 기록하면, 그 리소스가 두 개의 기록을 허용하지 않는 경우에 트랜잭션이 실패합니다.
트랜잭션에 스크립트가 포함되는 경우에는 그 스크립트도 트랜잭션의 일부로서 읽어 주십시오.
제한을 회피하고 싶은 경우
스크립트의 실행은 획득 액션이므로, acquireActionUseJobQueue를 활성화하면 다른 획득 액션으로부터 분리할 수 있습니다. enableAtomicCommit을 비활성화하면 스크립트와 다른 액션이 한 번의 기록에 모이지 않게 됩니다.
동시 실행과 재시도
GS2-Script 자체가 충돌을 반환하는 일은 없습니다. 동시 실행 요청과 충돌하는지는 스크립트가 무엇을 기록하는지에 따라 결정되며, 재시도 지침도 그 서비스의 것이 해당됩니다.
Acquire Action
입수 액션
Gs2Script:InvokeScript
스크립트 실행
지정된 Lua 스크립트를 제공된 JSON 인수로 동기적으로 실행합니다. 스테이터스 코드, 반환값, 트랜잭션 정보, 난수 상태, 실행 시간, 표준 출력을 포함한 실행 결과를 반환합니다. GS2 서비스 간 원자적 처리를 위한 트랜잭션 처리를 지원합니다.
수량 지정 가능한 액션: 아니오
반전 가능한 액션: 아니오
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| scriptId | string | ✓ | ~ 1024자 | 스크립트 GRN | ||
| userId | string | ~ 128자 | 사용자ID#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다. | |||
| args | string | “{}” | ~ 5242880자 | 스크립트에 전달되는 인수 (JSON 형식) | ||
| randomStatus | RandomStatus | 난수 상태 | ||||
| timeOffsetToken | string | ~ 1024자 | 타임 오프셋 토큰 |
{
"action": "Gs2Script:InvokeScript",
"request": {
"scriptId": "[string]스크립트 GRN",
"userId": "[string]사용자ID",
"args": "[string]스크립트에 전달되는 인수 (JSON 형식)",
"randomStatus": {
"seed": "[long]난수 시드",
"used": [
{
"category": "[long]카테고리",
"used": "[long]사용 횟수"
}
]
},
"timeOffsetToken": "[string]타임 오프셋 토큰"
}
}action: Gs2Script:InvokeScript
request:
scriptId: "[string]스크립트 GRN"
userId: "[string]사용자ID"
args: "[string]스크립트에 전달되는 인수 (JSON 형식)"
randomStatus:
seed: "[long]난수 시드"
used:
- category: "[long]카테고리"
used: "[long]사용 횟수"
timeOffsetToken: "[string]타임 오프셋 토큰"transaction.service("script").acquire.invoke_script({
scriptId="[string]스크립트 GRN",
userId="[string]사용자ID",
args="[string]스크립트에 전달되는 인수 (JSON 형식)",
randomStatus={
seed="[long]난수 시드",
used={
{
category="[long]카테고리",
used="[long]사용 횟수"
}
}
},
timeOffsetToken="[string]타임 오프셋 토큰",
})