GS2-Dictionary トランザクションアクション
アクションの組み合わせと同時実行
すべてのサービスに共通する前提は トランザクションアクションの組み合わせ にまとめています。先にそちらを読んでください。この節の残りは GS2-Dictionary 固有の内容です。
GS2-Dictionary のトランザクションアクションは、ネームスペースとユーザーの組で決まる 1 人のユーザーの図鑑、つまり取得済みエントリーの一覧を対象にします。エントリーの追加・削除はこの一覧をまるごと書き換える形で反映されます。
| 操作 | 同じ行を重ねたとき | 入れ子越し | 別の対象になる境界 |
|---|---|---|---|
エントリーの追加AddEntriesByUserId | 統合され、エントリー名が重複を除いて結合される | 失敗する | ネームスペース・ユーザー |
エントリーの削除DeleteEntriesByUserId | 統合され、エントリー名が重複を除いて結合される | 失敗する | ネームスペース・ユーザー |
エントリーの検証VerifyEntryByUserId | 先勝ち | 読み取りだけなので衝突しない | エントリー・検証タイプ |
追加と削除は行が違い、境界が同じです。1 つの図鑑に対する追加と削除を同じトランザクションで行うことはできません。トランザクションを分けてください。
追加は重複を取り除いて統合されるので、同じエントリーが複数のアクションに現れてもかまいません。100 件の上限も、重複を除いたあとの数で判定されます。
追加と削除のどちらかが結果的に図鑑を書き換えなかった場合、たとえば追加対象をすべて取得済みだったり、削除対象を 1 件も持っていなかったりした場合には、同居していてもトランザクションが成功することがあります。実行時点のユーザーの取得状況に左右されるため、これを前提に設計しないでください。
検証アクションはトランザクション開始時点の図鑑を見ます。同じトランザクションで追加したエントリーを have で検証したり、削除したエントリーを havent で検証したりすることはできません。
入れ子になったトランザクションに注意
並べて書けば 1 件に統合されたはずの追加どうしでも、片方が内側から届く場合はトランザクションが失敗します。同じエントリーを両方の経路から追加した場合も同様です。
制限を回避したい場合
エントリーの追加は入手アクション、削除は消費アクションです。内側から届いた追加との衝突は acquireActionUseJobQueue を有効にすれば解消できますが、追加と削除の同居は enableAtomicCommit を無効にしないと解消しません。
同時実行とリトライ
同一ユーザーの図鑑を複数のリクエストが同時に更新した場合、後から確定した側がコンフリクト (409) になります。図鑑の内容に問題があるわけではないので、リトライすれば成功します。
同一ユーザーに対して図鑑を更新するリクエストを短時間に並行して発行するほど発生しやすくなります。追加と削除を 1 つのトランザクションにまとめる、同一ユーザーへの更新は直列化する、といった対策が有効です。
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を指定してエントリーを登録
指定されたユーザーの図鑑に1つ以上のエントリーを登録します。
バッチ操作として複数のエントリーモデル名を一度に指定できます。
既に登録済みのエントリーはエラーにならず、スキップされます。
返されるリストには、新たに追加されたエントリーのみが含まれます。
数量指定可能なアクション:いいえ
反転可能なアクション:はい
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| 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]タイムオフセットトークン",
})