さかなだってトランザクション処理が必要だもん!
ってなんだ。なんだこのタイトルは。
本記事を読み終える頃にはこのタイトルの意味がわかるようになっているはずである。
タイトルにもある通り、ドラクエXにおける「さかな」というデータの扱い方から、ドラクエXの技術的側面の一端を解説することを試みる。
ドラクエXをご存知だろうか
日本を代表するゲームタイトル「ドラゴンクエスト」の記念すべき10番目のタイトルであり、そしてシリーズ初のオンラインタイトルである。日頃、我々はゲームをプレイする中で、あまり技術的な側面を意識しない。
今回は日本人ならまず聞いたことのあるドラゴンクエストの裏側をのぞいていく。
さて、タイトルの意味を解説する
ドラクエXには、各プレイヤーが自宅を所有することができ、その自宅には水槽を配置し、その中にさかなを入れることでオブジェとして飾ることができる。
タイトルの意味するところとして、平たくいえば、プレイヤー所有のさかなデータが水槽に移動するとき、トランザクション処理が必要であるという話である。

(https://hiroba.dqx.jp/sc/shop/item/1649511f46866ce35939cebf4fc081c30a/ より引用)
この話はこれだけでも良いのだが、もう少し深掘りすることで、ドラクエXのシステムのイメージが分かるので、もう少し詳しく解説する。
ドラクエXにおけるワールド処理
ワールドとは文字どおり、ゲーム世界そのもののことである。さかなとトランザクション処理を正しく理解するには、まずはワールドについて理解する必要がある。
ドラクエXのプレイヤー総数は10万人程度とされている。(出典: https://daroom.hatenablog.com/entry/2026/03/24/222105)
これほど多くのプレイヤーを処理するには、1つのワールドでは不足している。ここでの「1つのワールド」とは「1つのプロセス」と理解してもらって良いだろう。つまり言い換えると、10万人規模のプレイヤーを単一のワールドプロセスで処理することができないということになる。
プロセスとは、Windowsのタスクマネージャーから見ることのできるアレと同じものだと理解している。
そこで、ドラクエXでは40個のワールドプロセスに分割することで、負荷分散を図っている。
しかしドラクエXの広大な世界を全て処理しきるには、それでも足りないのである。その世界を地形ごとに区切ることで、さらに負荷分散を図っている。これらの区切られた単位をゾーンと呼ぶ。

(https://hiroba.dqx.jp/sc/public/playguide/guide_4_22/ より引用)
村、山脈、洞窟、そして自宅の中など、別々の空間の処理を、別々のゾーンプロセスが担当している。ゾーンプロセスこそがMMORPGの主役と言っても過言ではなく、我々プレイヤーが最も接しているものだろう。
村人に話しかけることでクエストが開始される、フィールドを跋扈するモンスターとエンカウントして戦闘に発展する、自宅の水槽で飼っているさかなを眺める。これらが別のゾーンプロセスで処理されるのである。
これらのゾーンプロセスが、それぞれが所属するワールドプロセスと通信をすることで、プレイヤーはゾーン間の移動が可能となる。A村からB山脈へ移動するとき、その情報がゾーンプロセス「A村」→ワールドプロセスX→ゾーンプロセス「B山脈」へと伝わることで、移動が可能となる。
ドラクエXにおけるデータ管理
上述のとおり、ドラクエXはプレイヤーがゾーン間を自由に行き来できる。
これがデータ管理の際のボトルネックとなっている。
通常のオンラインRPGゲームはワールド単位で別々のDBサーバーを用意しているのだが、ドラクエXはゾーン間の移動が可能であるため、単一DB1で全データを一元管理している。
このDBではプレイヤーキャラクターデータとそれ以外のデータが管理されている。プレイヤーキャラクターデータとは、プレイヤーの名前・職業・性別・経験値・ストーリーの進行度などが該当する。
ここまで解説したらもうあと少し
ドラクエXでは釣りによりさかなというアイテムを獲得することができる。プレイヤーがさかなを所持しているときは、さかな袋で管理されている。さかな袋はキャラクターが保持しているデータである。
そこから、自宅で飾られている水槽にさかなを移動させる状況を考えてほしい。
まず上述の通り、自宅はゾーンプロセスで管理されている。そして自宅にプレイヤーがいないときも、さかなは水槽で飼われていて、そこで泳いでいる必要がある。
つまり、さかなというデータを管理している主体がプレイヤーキャラクターデータを管理しているテーブルからゾーンプロセス固有のデータを管理しているテーブルへ移動したことになる。
この同期が発生する際、トランザクション処理が必要ということである。
さかな袋から水槽に移動させるとき、さかなが分裂することも消滅することも許されない。
さかなの匹数を保ったまま、さかな袋から水槽へ移動させる必要があるのである。
という話だった
トランザクション処理と聞くと、銀行だとかが例としてよく出るのだが、ドラゴンクエストという親しみのあるゲームタイトルでもしっかり使われていることに感動して記事にまとめてしまった。
今回の記事の元ネタは以下の書籍。
同タイトルを裏側から支える技術を解説した本である。この本はドラクエXの技術責任者でもあった著者がシステムの全体感や経験をまとめた一冊で、おすすめである。
ぜひ書店で手に取ってみてほしい。
以上。
おまけ
この記事をinputにChatGPTに「説明用スライドを作成して」とお願いをした。分かりやすい要約画像が出てきてすごい。
-
実態としては、RDBMSであるOracle DatabaseとKVSであるKyoto Tycoonの組み合わせで、データを管理しているようである。KVSとはKey-Value Storeの略で、Keyで検索することで1つのValueが返ってくる。AWSでいうところのParameter Storeがこれに該当する ↩
