令和7年度 秋期 データベーススペシャリスト試験 午後II 問1 コード決済の分散トランザクション設計
この問題は2025(R7)秋 データベーススペシャリスト 午後IIに出題されたものです。出題時点の法令・制度に基づく内容のため、現行の内容と一致しない場合があります。
本ページの問題文・選択肢は、原本の体裁を Web 表示用に正規化しています(改行・記号・数式・図表参照の調整)。設問の趣旨および正解に影響する変更は加えていません。
学習ガイド
コード決済業者の決済・ポイント管理業務を題材に、サービス分割時代のデータ整合性を問う午後Ⅱの問題です。分散トランザクションのACID特性と、メッセージング連携によるBASE特性の対比を軸に、ISOLATIONレベルの選択、障害時のトランザクション状態の分析、補償トランザクションの設計までを扱います。この記事では、決済とポイント付与の間でメッセージが失われる各ケースの状態遷移を追い、補償処理の解答を状態表から導きます。
この記事で押さえる論点
- ACID特性とBASE特性の違いをサービス分割の文脈で説明する
- ISOLATIONレベルの選択理由を不都合の具体例から導く
- メッセージング連携の障害ケースと補償トランザクションを設計する
出題情報
- 出題
- 2025(R7)秋 データベーススペシャリスト 午後II 問1
- 配点
- 100点満点
- 模範解答
- 公表(設問ごとに掲載)
出題趣旨・採点講評(IPA 公表)
機能ごとに独立したサービスを組み合わせて全体のサービスを構築する方式を取ることも多くなっている。この方式では,スケーリング,デプロイが容易になる一方で,データの整合性維持が難しくなる傾向がある。従来の分散トランザクションを用いる方式がACID特性を重視するのに対して,この方式はBASE特性による可用性の維持に重点を置いている。それぞれの方式には長所,短所があり,業務の要求事項を考慮して,より適切な方式を選択する必要がある。
本問では,コード決済事業者の決済業務を題材として,データ操作を設計する能力,適切な排他制御を選択し評価する能力,分散トランザクションを分析・設計する能力,テーブル構造を設計する能力,インテグリティ制約を実装する能力を問う。
問1では,コード決済業者のコード決済システムを題材に,データベースの実装・運用について出題した。全体として正答率は平均的であった。
問題本文
問1 コード決済業者の決済業務及びポイント管理業務におけるデータベースの実装・運用に関する次の記述を読んで,設問に答えよ。
A社は,バーコードを用いたキャッシュレスの決済サービス,及び商品購入などに応じて一定のポイントを付与するポイントサービスを提供している。A社では,ポイントサービス利用件数の急増を受けて,システムの変更を検討している。
〔業務・現行システムの概要〕
- サービスの概要
(1) 決済サービス
① 決済サービスを利用する人(以下,決済会員という)は,決済会員登録を行い,金融機関などから一定の金額を決済サービスに入金した上で,物品購入などの支払に充てる。入金及び支払に伴う残高を決済残高という。
② 決済サービスに加盟する事業者(以下,決済加盟店という)は,決済サービスへの加盟申請,審査を経て決済加盟店登録を受ける。
③ 決済会員は,スマートフォンなどの携帯端末,決済加盟店の店舗に設置されたPC, POSなどの端末(これらをまとめて,以下,端末という)を使用して,バーコードを読み取ることで支払を行う。同じ決済会員が同時に複数の支払を行うことはない。
④ 決済は,決済会員の決済残高から支払金額を差し引くことで完了する。
⑤ A社は,月に1回まとめて決済金額を決済加盟店に支払う。
(2) ポイントサービス
① ポイントサービスを利用する人(以下,ポイント会員という)は,ポイント会員登録を行ってポイントサービスを利用する。
② ポイントサービスに加盟する事業者(以下,ポイント加盟店という)は,ポイントサービスへの加盟申請,審査を経てポイント加盟店登録を受ける。
③ ポイント会員は,ポイント加盟店での支払,くじ引き,イベント参加などによってポイントを獲得する。
④ 獲得したポイントには,有効期限の年月が決まっている。獲得したポイントはポイント残高として貯めておき,支払に充てることができる。
⑤ 獲得したポイントは,すぐにポイント残高に反映されることもあれば,翌日以降になる場合もある。
(3) サービス間の連携
決済金額の一部をポイントで支払い,残りを決済残高から支払う場合など,両方のサービスを連携した決済を行うことがある。
- システム構成
現行システムのシステム構成を図1に示す。決済サービス,ポイントサービスそれぞれに専用のサーバ及びRDBMSを用いている。サーバ上ではサービスに用いるアプリケーションプログラム(以下,APという)が稼働している。両サービスを連携した処理は,決済APを介して決済DB,ポイントDBの両方にアクセスする。

図の説明テキスト
図1 現行システムのシステム構成
ネットワーク構成図。構成は以下の通り:
- 「端末」から「決済サーバ」(内包:決済AP)と「ポイントサーバ」(内包:ポイントAP)に接続されている。
- 「決済サーバ」の「決済AP」から「決済DB」に接続されている。
- 「ポイントサーバ」の「ポイントAP」から「ポイントDB」に接続されている。
- さらに、「決済サーバ」の「決済AP」から「ポイントDB」にも接続されている。
- テーブル構造
決済サービス,ポイントサービスのテーブル構造をそれぞれ図2,3に,主な属性の意味・制約を表1に示す。なお,属性名の#は番号,Cはコード,Fはフラグを略した記号である。

図の説明テキスト
図2 決済サービスのテーブル構造(一部省略)
四角い枠内に以下のテーブル定義が列挙されている。主キーには実線の下線、外部キーには破線の下線が引かれている。主キーかつ外部キーの属性には実線と破線が二重に引かれている。
- 決済加盟店 (決済加盟店#[実線], ポイント加盟店#[破線], 名称, 支払先口座, …)
- 店舗 (決済加盟店#[実線/破線], 店舗#[実線], 決済方式, 所在地, …)
- 決済会員 (決済会員#[実線], ポイント会員#[破線], 表示名, 最終入金#[破線], 認証, …)
- 決済残高 (決済会員#[実線/破線], 残高)
- 入金履歴 (決済会員#[実線/破線], 入金#[実線], 入金日, 入金金額, 入金方法)
- 決済履歴 (履歴#[実線], 決済加盟店#[破線], 店舗#[破線], 決済会員#[破線], 決済日, 決済金額, 使用ポイント数)
- 加盟店支払 (決済加盟店#[実線/破線], 支払年月[実線], 締め日, 支払予定日, 支払予定金額)

図の説明テキスト
図3 ポイントサービスのテーブル構造(一部省略)
ポイント会員ランク (ポイント会員ランクC[実線], 名称, 達成ポイント数)
ポイント獲得方法 (ポイント獲得方法C[実線], 名称)
ポイント付与率 (ポイント獲得方法C[実線], ポイント会員ランクC[実線], 付与倍率)
ポイント加盟店 (ポイント加盟店#[実線], 名称, 所在地, …)
ポイント会員 (ポイント会員#[実線], ポイント会員ランクC[破線], 氏名, 生年月日, 住所, 認証, …)
ポイント残高 (ポイント会員#[実線], 有効期限年月[実線], 残数, 有効F)
会員ランク履歴 (ポイント会員#[実線], 変更日[実線], ポイント会員ランクC[破線])
ポイント獲得履歴 (履歴#[実線], ポイント会員#[破線], ポイント加盟店#[破線], ポイント獲得方法C[破線], 獲得日, 有効期限年月, 獲得ポイント数, 残高反映F)
ポイント使用履歴 (履歴#[実線], ポイント会員#[破線], ポイント加盟店#[破線], 使用日, 使用ポイント数)

図の説明テキスト
表1 主な属性の意味・制約
| 属性名 | 意味・制約 |
|---|---|
| 決済方式 | バーコードの読取りを利用者の端末,店舗の端末のどちらで行うかを表す区分 |
| 入金# | 決済会員ごとに決済残高への入金の都度払い出す連番 |
| 入金方法 | 入金時に使用した銀行口座,クレジットカードなどの情報 |
| ポイント獲得方法C | ポイント加盟店での支払,くじ引き,イベント参加などポイント獲得の方法を表すコード |
| 有効期限年月, 残数 | ポイントが有効な期間は,獲得方法によって異なる。“ポイント獲得履歴”テーブルには獲得したポイントの有効期限年月を設定し,“ポイント残高”テーブルには有効期限年月ごとにポイントの残数を記録する。 |
| 履歴# | “決済履歴”,“ポイント獲得履歴”,“ポイント使用履歴”テーブルの履歴#には,それぞれに一意な番号を自動的に設定する。 |
| 有効F | 有効期限年月が現在の年月以降の場合はTRUE,それよりも前のものはFALSEを設定する。 |
| 残高反映F | 獲得ポイント数を“ポイント残高”テーブルの残数に加算済みの場合はTRUE,未加算の場合はFALSEを設定する。 |
- 主な処理
各サービスの主な処理の内容を表2に,表2中のS1,S2,P2,P3の処理概要とSQL文を表3〜6に示す。各処理は一つ以上のステップから成る。表2〜6中の二重引用符で囲んだ名前は,図2,3中のテーブル名である。

図の説明テキスト
表2 主な処理の内容
| サービス | 処理ID | 名称 | 内容 |
|---|---|---|---|
| 決済サービス | S1 | 決済残高入金処理 | 決済会員の指示によって金融機関からの入金実行を記録し,“決済残高”の残高に反映する。 |
| 決済サービス | S2 | 決済残高消費処理 | 決済会員の決済指示を受けて,“決済残高”の残高を消費して,内容を“決済履歴”に記録する。 |
| ポイントサービス | P1 | ポイント獲得処理 | ポイント会員がポイントを獲得する都度,獲得したポイント数を“ポイント獲得履歴”に記録する。 |
| ポイントサービス | P2 | 獲得ポイント反映処理 | 任意のタイミングで,ポイント会員のポイント獲得履歴を“ポイント残高”の有効期限年月該当行に反映する。 |
| ポイントサービス | P3 | ポイント消費処理 | ポイント使用指示を受けて,“ポイント残高”の残数を消費して,内容を“ポイント使用履歴”に記録する。 |

図の説明テキスト
表3 S1の処理概要とSQL文
| ステップ | 処理概要(上段)とSQL文(下段) |
|---|---|
| S1-1 | 決済会員の“決済残高”の残高に入金金額を加算して更新する。 UPDATE 決済残高 SET 残高 = 残高 + :hv3 WHERE 決済会員# = :hv1 |
| S1-2 | “決済会員”の最終入金#を更新する。 UPDATE 決済会員 SET 最終入金# = 最終入金# + 1 WHERE 決済会員# = :hv1 |
| S1-3 | “入金履歴”の入金#に更新後の最終入金#を設定して行を追加する。 INSERT INTO 入金履歴 (決済会員#, 入金#, 入金日, 入金金額, 入金方法) SELECT 決済会員#, 最終入金#, :hv2, :hv3, :hv4 FROM 決済会員 WHERE 決済会員# = :hv1 |
| 注記 ホスト変数hv1〜hv4には,決済会員#,入金日,入金金額,入金方法をそれぞれ設定する。 |

図の説明テキスト
表4 S2の処理概要とSQL文
| ステップ | 処理概要(上段)とSQL文(下段) |
|---|---|
| S2-1 | 決済会員の“決済残高”の残高が決済金額以上であることを確認し,残高が不足していれば,戻り値に残高不足エラーを設定して処理を終了する。 SELECT 残高 FROM 決済残高 WHERE 決済会員# = :hv1 AND 残高 >= :hv5 FOR UPDATE |
| S2-2 | 決済会員の“決済残高”の残高から決済金額を減算して更新する。 UPDATE 決済残高 SET 残高 = 残高 - :hv5 WHERE 決済会員# = :hv1 |
| S2-3 | “決済履歴”の各列に対応するホスト変数の値を設定して行を追加する。 INSERT INTO 決済履歴 (決済加盟店#, 店舗#, 決済会員#, 決済日, 決済金額, 使用ポイント数) VALUES(:hv2, :hv3, :hv1, :hv4, :hv5, :hv6) |
| 注記 ホスト変数hv1〜hv6には,決済会員#,決済加盟店#,店舗#,決済日,決済金額,使用ポイント数をそれぞれ設定する。 |

図の説明テキスト
表5 P2の処理概要とSQL文(未完成)
| ステップ | 処理概要(上段)とSQL文(下段) |
|---|---|
| P2-1 | 指定されたポイント会員#について“ポイント獲得履歴”からポイント残高未反映の行の獲得ポイント数を有効期限年月ごとにまとめて,“ポイント残高”の該当行があれば残数に獲得ポイント数を加算して更新し,行がなければ残数に獲得ポイント数を設定して行を追加する。 MERGE INTO ポイント残高 A USING (SELECT ポイント会員#, 有効期限年月, a AS 加算ポイント数 FROM ポイント獲得履歴 WHERE ポイント会員# = :hv1 AND b GROUP BY ポイント会員#, 有効期限年月) B ON (A.ポイント会員# = B.ポイント会員# AND A.有効期限年月 = B.有効期限年月) WHEN MATCHED THEN UPDATE SET c WHEN NOT MATCHED THEN INSERT (ポイント会員#, 有効期限年月, 残数, 有効F) VALUES( d , TRUE) |
| P2-2 | “ポイント獲得履歴”の該当行の残高反映Fの値を更新する。 UPDATE ポイント獲得履歴 SET 残高反映F = TRUE WHERE ポイント会員# = :hv1 AND 残高反映F IS FALSE |
| 注記 ホスト変数 hv1 にはポイント会員#を設定する。 |

図の説明テキスト
表6 P3の処理概要とSQL文
| ステップ | 処理概要(上段)とSQL文(下段) |
|---|---|
| P3-1 | 指定されたポイント会員#について“ポイント残高”から有効期限内の残数を集計して求めた使用可能ポイント数が使用ポイント数に満たない場合は,戻り値にポイント不足エラーを設定して処理を終了する。 SELECT SUM(残数) AS 使用可能ポイント数 FROM ポイント残高 WHERE ポイント会員# = :hv1 AND 有効F IS TRUE |
| P3-2 | ①のSQL文に基づくカーソルによって,“ポイント残高”からポイントが有効な行を有効期限年月の昇順に読み込み,行ごとに残数を使用ポイント数に合わせて消し込む。ホスト変数 lv1 に消し込むポイント数(以下,消込ポイント数という)を,lv2 に有効期限年月を設定して②の更新を行い,使用ポイント数を全て消し込むまで繰り返す。 ① SELECT 有効期限年月,残数 FROM ポイント残高 WHERE ポイント会員# = :hv1 AND 有効F IS TRUE ORDER BY 有効期限年月 ASC ② UPDATE ポイント残高 SET 残数 = 残数 - :lv1 WHERE ポイント会員# = :hv1 AND 有効期限年月 = :lv2 |
| P3-3 | “ポイント使用履歴”の各列に対応するホスト変数の値を設定して行を追加する。 INSERT INTO ポイント使用履歴 (ポイント会員#, ポイント加盟店#, 使用日, 使用ポイント数) VALUES(:hv1, :hv2, :hv3, :hv4) |
| 注記 ホスト変数 hv1〜hv4 には,ポイント会員#,ポイント加盟店#,使用日,使用ポイント数をそれぞれ設定する。 |
- 現行システムで使用するRDBMSの排他制御機能
(1) トランザクションの ISOLATION レベルごとの排他制御は、次のとおりである。
① READ COMMITTED では,行の参照時に対象行の共有ロックを取得し,参照終了時に解放する。行の更新時に対象行の専有ロックを取得し,トランザクション終了時に解放する。
② REPEATABLE READ では,行の参照時に対象行の共有ロックを,行の更新時に対象行の専有ロックを取得し,トランザクション終了時に解放する。
③ SERIALIZABLE は,行の参照時又は更新時に表単位の専有ロックを取得し,トランザクション終了時に解放する。
(2) READ COMMITTED 及び REPEATABLE READ では,SELECT 文に FOR UPDATE 句を指定すると,行の参照時に対象行の専有ロックを取得し,トランザクション終了時に解放する。
〔現行システムの決済処理〕
決済処理では,表2中の処理 S2 及び P3 を一つのトランザクションとして実行するために,2相コミットプロトコルを用いている。
- 決済処理の流れ
決済処理の正常実行時のシーケンス図を図4に示す。図中の①〜⑬は実行の順番を,時点A,Bは実行の流れにおける特定の時点を表している。

図の説明テキスト
図4 決済処理の正常実行時のシーケンス図(未完成)
参加するライフラインは左から「端末」「決済AP」「決済DB」「ポイントDB」。
以下の順でメッセージがやり取りされる。
・端末から決済APへ: ①決済指示
・決済APから決済DBへ: ②S2実行指示
・決済DBから決済APへ: ③S2完了
・決済APからポイントDBへ: ④P3実行指示
・ポイントDBから決済APへ: ⑤P3完了
・決済APから決済DBへ: ⑥コミット準備指示
・決済DBから決済APへ: ⑦コミット準備完了
・決済APからポイントDBへ: ⑧コミット準備指示
・ポイントDBから決済APへ: ⑨コミット準備完了 (この時点の横に「時点A」と記載)
・決済APから決済DBへ: ⑩コミット実行指示
・決済DBから決済APへ: ⑪コミット完了
・決済APからポイントDBへ: ⑫コミット実行指示
・ポイントDBから決済APへ: ⑬コミット完了 (この時点の横に「時点B」と記載)
- 障害からの回復
決済処理の実行中に障害によってポイントDBが異常終了する状況を想定した障害・回復の事例を表7にまとめた。表中の時点A,Bは,図4中の時点A,Bに対応している。

図の説明テキスト
表7 決済処理中の障害・回復の事例(未完成)
| 事例 | 内容 |
|---|---|
| 事例1 | 決済処理中の時点AでポイントDBが障害によって異常終了した。障害除去後に再始動したところ,ポイントDBにはコミット準備のログがあり,トランザクションは未コミットの状態となった。決済APは,ポイントDBに状態を問い合わせ,決済DB及びポイントDBに e を行った。 |
| 事例2 | 決済処理中の時点AでポイントDBが障害によって異常終了した。障害除去後に再始動したところ,ポイントDBにはコミット準備のログがなく,トランザクションはロールバックされた。決済APは,ポイントDBに状態を問い合わせ,決済DBに f を行った。 |
| 事例3 | 決済処理中の時点BでポイントDBが障害によって異常終了した。障害除去後に再始動したところ,ポイントDBはロールフォワードによってデータベースを回復した。決済APは,ポイントDBに状態を問い合わせ, g した。 |
| 事例4 | 決済処理中の時点AでポイントDBが障害によって異常終了した。㋐復旧までの時間が長くなることで,業務上の不都合が生じたので,決済DBにおいて仕掛り中のトランザクションをヒューリスティックな決定によって全てコミットした。障害除去後の再始動において,ポイントDBは未コミットのトランザクションをロールバックした。 |
〔システム変更案の検討〕
ポイントサービスでは,ECサイトを運営する加盟店の増加によって,サービス利用件数が急増し,ポイントDBの応答性能,可用性の低下が問題になっている。その対策として,次のシステム変更案を検討している。
- システムの構成変更
検討中のシステム構成を図5に示す。業務機能別に会員サービス,決済サービス,ポイントサービスに分け,サービスごとに専用のサーバとデータベースを配置する。各サービスには独立した疎結合のAP及びデータベースを用いて,サービス内部の実装は隠蔽する。サービスに連携するアプリケーションプログラミングインタフェース(以下,APIという)だけを公開し,APIを呼び出すごとに単一のトランザクションとして処理する。端末からのアクセス時には,会員サービスを入り口にして他のサービスに連携する。

図の説明テキスト
図5 検討中のシステム構成
システムを構成する各要素とその接続関係を示すブロック図。
・「端末」から「会員サーバ(会員サービス)」へ接続されている。
・「会員サーバ(会員サービス)」は、「会員DB」に接続されている。
・「会員サーバ(会員サービス)」は、「決済サーバ(決済サービス)」と「ポイントサーバ(ポイントサービス)」のそれぞれに接続されている。
・「決済サーバ(決済サービス)」は、「決済DB」に接続されている。
・「ポイントサーバ(ポイントサービス)」は、「ポイントDB」に接続されている。
(1) 会員サービス
① 決済会員,ポイント会員の会員情報の登録,端末からの接続認証など会員に関わる機能をもつAP,及び後述する複数サービスが関与する処理の実行制御を担うAPを配置する。
② 会員DBには,現行システムと同じRDBMSを使用する。“決済会員”,“ポイント会員ランク”及び“ポイント会員”テーブルを配置し,登録,認証に使用する。会員情報の登録,変更は他のサービスにも連携する。
(2) 決済サービス
① 決済APは,ポイントサービスと連携する処理を無効にすることを除いて変更せず,APIを決済APに連携することで,特定の機能を呼び出して実行する方式に変更する。
② 決済DBは,現行RDBMSのデータベースをそのまま使用する。
(3) ポイントサービス
① ポイントAPは応答性能,可用性を高めるために再構築する。APIをポイントAPに連携することで,特定の機能を呼び出して実行する方式に変更する。
② ポイントDBをNoSQLに分類されるデータベースに変更し,図3中の全てのテーブルのデータを移行する。新しいポイントDBは,次の特徴をもつ。
- ワイドカラムデータストアをもち,複数ノードにデータを分散して配置することで,高速性,高可用性を実現している。
- RDBMSにおけるテーブルと同様に,列及び主キーを定義できる。外部キーは定義できない。CRUD操作命令を行う言語をサポートしていて,表3〜6のSQL文と同様の操作を記述できる。
- 複数のCRUD操作命令をまとめて一つのトランザクションとして実行する機能はなく,CRUD操作命令の終了時点でデータへの操作が確定する。
- 2相コミットを実現する機能はない。
- 処理方式の設計
現行の2相コミットに替えて,次の処理方式を検討している。検討に当たって,ポイントDBに格納するデータの設計には,RDBMSのテーブル構造を用いる。
(1) 処理方式
① 複数サービスが関与する処理の実行制御を担うAP(以下,オーケストレーターという)を会員サーバに配置する。
② 端末からの要求ごとにオーケストレーターを割り当て,他サービスへの要求送信と結果受信とを同期的に行うことで,処理を順に実行していく。
③ オーケストレーターは,ワークフローの機能をもち,登録した処理を状態に応じて実行していく。タイムアウトなどの例外によって処理が異常終了した場合には,処理が成功するまで一定回数のリトライを行う。
④ リトライを経ても処理が失敗した場合,オーケストレーターは,それ以前に終了した処理について,ワークフローの逆方向に取消処理を順に実行する。取消処理では,データの変更を伴う場合に,そのデータ変更を取り消すトランザクション(以下,補償トランザクションという)を実行する。
(2) 実行制御テーブルの追加
会員DBに“決済指示”テーブルを追加し,オーケストレーターによるトランザクションの実行状態の記録,実行の制御に用いる。追加するテーブルのテーブル構造を図6に示す。“決済指示”テーブルの決済指示#は,決済指示ごとに一意な番号を自動採番し,トランザクションの識別子として使用する。オーケストレーターは,処理実行の指示及び補償トランザクション実行の指示に合わせて,“決済指示”テーブルに対応する行の全列の値を他サービスに連携する。

図の説明テキスト
図6 追加するテーブルのテーブル構造
決済指示 (決済指示#(実線下線), 加盟店#(破線下線), 店舗#(破線下線), 決済会員#(破線下線), ポイント会員#(破線下線), 決済金額, 使用ポイント数, 決済指示日時, 処理ID, ステップ, モード, 状態)
注記1 処理ID,ステップには仕掛り中の処理について表2〜6の処理ID,ステップのいずれかを設定する。モードには通常モード,取消モードのいずれか,状態には進行中,完了,失敗のいずれかを表す値を設定する。
注記2 外部キーは会員DBに配置するテーブルとの間にだけ設定する。
(3) 決済処理の流れ
決済処理を次のように実行することにした。
① 決済サービスでは,S2を一つのAPIとして実行する。
② ポイントサービスでは,P3のステップP3-1〜P3-3のそれぞれに対応するAPIを用意し,会員サービスはAPIを順番に実行する。
③ 会員サービスでは,他のサービスへの実行指示に対する処理結果を“決済指示”テーブルの状態に記録していく。
検討中の決済処理の正常実行時のシーケンス図を図7に示す。図7中の①〜⑮は実行の順番を,時点C〜Eは実行の流れにおける特定の時点を表している。

図の説明テキスト
図7 検討中の決済処理の正常実行時のシーケンス図
「端末」、「会員サービス」、「決済サービス」、「ポイントサービス」の4つのライフラインがあり、以下の順序でメッセージのやり取りと内部処理が行われる。
①決済指示 (端末から会員サービスへ)
②決済指示登録 (会員サービスの内部処理)
③S2実行指示 (会員サービスから決済サービスへ)
④S2完了 (決済サービスから会員サービスへ)
⑤決済指示更新 (会員サービスの内部処理)
⑥P3-1実行指示 (会員サービスからポイントサービスへ)
⑦P3-1完了 (ポイントサービスから会員サービスへ)。応答後、ポイントサービスのライフライン上に「時点C」の注記。
⑧決済指示更新 (会員サービスの内部処理)
⑨P3-2実行指示 (会員サービスからポイントサービスへ)
⑩P3-2完了 (ポイントサービスから会員サービスへ)。応答後、ポイントサービスのライフライン上に「時点D」の注記。
⑪決済指示更新 (会員サービスの内部処理)
⑫P3-3実行指示 (会員サービスからポイントサービスへ)
⑬P3-3完了 (ポイントサービスから会員サービスへ)。応答後、ポイントサービスのライフライン上に「時点E」の注記。
⑭決済指示更新 (会員サービスの内部処理)
⑮決済完了 (会員サービスから端末へ)
- テーブル構造及び処理の変更
(1) リトライへの対応
図7中の実行指示に対応する処理の中には,リトライによる実行指示を受けたときに,重複更新の発生が懸念されるものがある。これを避けるためのテーブル構造及び処理の変更を行う。㋑決済サービスでは,対策として図2中の一つのテーブルに列を一つ追加し,処理S2の先頭にステップを一つ追加する。ポイントサービスでも同様の対策を行う。
(2) ポイントDBの整合性確保
表6の処理P3は,ステップごとにデータ操作が確定するので,ステップ実行の合間に他のトランザクションから同じ会員のデータ更新があると,ポイントDB内のデータに不整合が生じるおそれがある。これを防ぐために“ポイント会員”テーブルに更新中Fの列を追加してTRUE又はFALSEを設定した上で,㋒P2及びP3に,それぞれ同じ内容の処理を行うステップを追加する。
- 補償トランザクションの設計
ここまでの検討結果を踏まえて,決済処理の補償トランザクションを表8にまとめた。表8中の処理IDは表2の処理ID,表8中のステップは表4,6のステップに対応し,補償トランザクションは,図7中の実行指示と同じ単位で実行するものとする。

図の説明テキスト
表8 決済処理の補償トランザクション(未完成)
| 処理ID | ステップ | 補償要否 | 補償可否 | 説明(補償不要の理由/補償不可の理由/補償処理の概要) |
|---|---|---|---|---|
| S2 | S2-1 | 不要 | - | 参照だけでデータの変更がない。 |
| S2-2 | 要 | 可 | h | |
| S2-3 | 要 | 可 | i | |
| P3 | P3-1 | 不要 | - | 参照だけでデータの変更がない。 |
| P3-2 | 要 | 不可 | ㋓使用ポイント数を有効期限ごとの残数から消費した消込ポイント数が分からない。 | |
| P3-3 | 要 | 可 | ||
| 注記1 補償要否には変更の取消しが必要ならば“要”を,それ以外は“不要”を記入する。 | ||||
| 注記2 補償可否には,現行システムのテーブル構造を前提に変更の取消しが可能ならば“可”を,可能でなければ“不可”を,補償が不要であれば“-”を記入する。 | ||||
| 注記3 説明には,補償不要の場合は不要の理由を,補償不可の場合は取消しができない理由を,それ以外は,補償処理の概要を記入する。 |
- 障害からの回復
表8の補償要否が“要”のステップは,全て補償可否が“可”となるように対策を行った上で,決済処理実行中にポイントサービスが障害によって停止する状況を想定した障害・回復の事例を表9にまとめた。表中の時点C〜Eは,図7中の時点C〜Eに対応する。

図の説明テキスト
表9 決済処理中の障害・回復の事例
| 事例 | 内容 |
|---|---|
| 事例5 | ポイントサービスが時点Cで障害によって停止した。オーケストレーターは,P3-1実行指示を一定回数リトライ後,S2の取消実行指示を行った。 |
| 事例6 | ポイントサービスが時点Dで障害によって停止した。オーケストレーターは,P3-2実行指示を一定回数のリトライ後,P3-1,S2の取消実行指示を順に行った。 |
| 事例7 | ポイントサービスが時点Eで障害によって停止した。オーケストレーターは,P3-3実行指示を一定回数のリトライ後,P3-2からS2までの取消実行指示を順に行った。 |

図の説明テキスト
図8 “ポイント消込履歴”テーブルのテーブル構造(未完成)
ポイント消込履歴 ( j , 消込ポイント数)
設問と解答・解説
設問1
〔業務・現行システムの概要〕について答えよ。
(1)
模範解答
SUM(獲得ポイント数)
残高反映F IS FALSE
残数 = A.残数 + B.加算ポイント数
B.ポイント会員#, B.有効期限年月, B.加算ポイント数
採点基準(配点 7点)
知識・理解度(内容)(4点)
- 4点: 空欄に入るべきSQLの構文や条件式を正確に理解している。
- 2点: SQLの構文や条件式の一部に誤りがあるが、意図は理解できる。
- 0点: 理解が不十分である。
論理性(構造)(3点)
- 3点: 全ての空欄について、論理的な整合性が保たれた記述ができている。
- 1点: 論理的な整合性が一部欠けている。
- 0点: 記述が全く論理的でない。
解説
解説
表5中の空欄a〜dに関するSQL更新処理の解説です。
- a: 獲得ポイント数の合計を計算するため、集計関数 SUM(獲得ポイント数) が入ります。
- b: 残高反映が未済であることを示す条件として、 残高反映F IS FALSE が適切です。
- c: 残数の更新は、既存の残数に加算ポイント数を足すため、 残数 = A.残数 + B.加算ポイント数 となります。
- d: グループ化の基準として、 B.ポイント会員#, B.有効期限年月, B.加算ポイント数 を指定します。
高得点のポイント
- SQLの集計関数と条件式を正確に理解していること - テーブルの結合条件や更新ロジックを論理的に組み立てられること
(2)
一貫性の観点から,処理実行時のISOLATIONレベルについて答えよ。
(a) 表3の処理S1のISOLATIONレベルはREAD COMMITTEDが適切である。
REPEATABLE READである必要がない理由を30字以内で具体的に答えよ。
模範解答
参照する行の専有ロックを事前に取得するから
同じ行の複数回の読み込みがないから
採点基準(配点 7点)
知識・理解度(内容)(4点)
- 4点: トランザクション分離レベルの性質と処理S1の要件を正確に理解している。
- 2点: トランザクション分離レベルの性質について部分的な理解が見られる。
- 0点: 理解が不十分である。
論理性(構造)(3点)
- 3点: REPEATABLE READが不要な理由を論理的に明確に説明できている。
- 1点: 説明の論理構成が一部不明確である。
- 0点: 論理的な説明になっていない。
解説
解説
処理S1においてREPEATABLE READが不要な理由を問う問題です。REPEATABLE READは同じトランザクション内で同じ行を複数回読み込んだ際に値が変わらないことを保証しますが、S1では 同じ行の複数回の読み込みがない ため、READ COMMITTEDで十分です。また、更新のための参照であるため 参照する行の専有ロックを事前に取得する ことで一貫性が保たれます。
高得点のポイント
- READ COMMITTEDとREPEATABLE READの違いを正確に理解していること - 処理S1の特性に合わせた適切なトランザクション分離レベルを論理的に説明できること
(3)
(b) 表6の処理P3のISOLATIONレベルはSERIALIZABLEが適切である。
REPEATABLE READでは不都合がある理由を30字以内で具体的に答えよ。
模範解答
P2の追加行の有無がP3のステップによって異なるから
P2の追加行のファントムリードが発生するから
採点基準(配点 7点)
知識・理解度(内容)(4点)
- 4点: ファントムリードの発生条件とSERIALIZABLEの必要性を正確に理解している。
- 2点: ファントムリードについて部分的な理解が見られる。
- 0点: 理解が不十分である。
論理性(構造)(3点)
- 3点: 不都合が生じる理由を具体事例に即して論理的に説明できている。
- 1点: 説明の論理構成が一部不明確である。
- 0点: 論理的な説明になっていない。
解説
解説
処理P3においてREPEATABLE READでは不都合がある理由を問う問題です。REPEATABLE READでは ファントムリード を防ぐことができず、P2で追加された行の有無によってP3の実行結果(ポイント不足エラーの判定など)が変わってしまうリスクがあります。これを防ぐためにはSERIALIZABLEが必要です。
高得点のポイント
- ファントムリードの発生条件を正確に理解していること - 複数トランザクション間の競合リスクを論理的に説明できること
設問1では,(2)の正答率が低かった。ノンリピータブルリード,ファントムリードが発生する条件を正しく理解し,適切なトランザクション分離レベルを判断する技術を身に付けてほしい。
設問2
〔現行システムの決済処理〕について答えよ。
(1)
図4について答えよ。
(a) “①決済指示”に対応する“決済完了”の応答が欠けている。トランザクションが正常に終了するとみなした時点で決済APから端末に応答を返すとしたら,③〜⑬のどのメッセージの受信後か。番号を一つ答えよ。
模範解答
⑨
採点基準(配点 6点)
正確性(内容)(6点)
- 6点: 対象のメッセージ番号を正確に選択できている。
- 3点: 関連する段階の番号を選んでいるが正答ではない。
- 0点: 不正解である。
解説
解説
2相コミットプロトコルにおけるメッセージの送受信順序に関する問題です。決済指示に対する応答は、全リソースのコミットが確定した段階で返すべきです。図4における ⑨(コミット実行指示への応答受信)の後に決済完了の応答を返すのが適切です。
高得点のポイント
- 2相コミットプロトコルの基本的な流れを正確に理解していること
(2)
(b) ポイントDBが④受信後のP3実行において,ステップP3-1でポイント不足エラーを返した場合,⑥及び⑧で同じメッセージを送信してトランザクションを終了する。送信するメッセージの内容を答えよ。
模範解答
ロールバック実行指示
採点基準(配点 6点)
知識・理解度(内容)(3点)
- 3点: 障害発生時のロールバックの必要性を正確に理解している。
- 1点: 部分的な理解が見られる。
- 0点: 理解が不十分である。
論理性(構造)(3点)
- 3点: 送信すべきメッセージを論理的に正しく記述できている。
- 1点: 記述にやや不明確な点がある。
- 0点: 不適切な記述である。
解説
解説
ポイントDBでポイント不足エラーが発生した場合のトランザクション制御についてです。この場合、全体のトランザクションを取り消す必要があるため、決済APは各DBに対して ロールバック実行指示 を送信してトランザクションを終了します。
高得点のポイント
- 障害発生時のトランザクションのロールバック手順を正確に理解していること - システム全体の整合性を保つための論理的な対応を記述できること
(3)
(c) 時点Aと時点Bとでは,トランザクションの状態が異なる。状態の相違点を45字以内で具体的に答えよ。
模範解答
時点Aはコミット,ロールバックが不定の状態,時点Bはコミットが確定した状態
時点AはIn doubtの状態,時点BはIn commitの状態
採点基準(配点 6点)
知識・理解度(内容)(3点)
- 3点: 各時点でのトランザクション状態を正確に理解している。
- 1点: 状態の理解に一部誤りがある。
- 0点: 理解が不十分である。
論理性(構造)(3点)
- 3点: 相違点を比較形式で論理的かつ明確に説明できている。
- 1点: 説明の構造が不十分で相違点が分かりにくい。
- 0点: 論理的な説明になっていない。
解説
解説
トランザクションの状態遷移に関する問題です。時点A(コミット準備応答前)はコミットするかロールバックするかが不定の状態( In doubt の状態)ですが、時点B(コミット実行指示送信後)はすでにコミットが確定した状態( In commit の状態)です。この違いを明確に記述する必要があります。
高得点のポイント
- 2相コミットプロトコルにおける各時点でのトランザクション状態を正確に理解していること - 状態の相違を比較形式で論理的に説明できること
(4)
表7について答えよ。
(a) 事例1〜3の e に入れる適切な字句を次の中から選択して答えよ。
模範解答
選択肢イ: コミット実行指示
配点 3点
解説
解説
事例1〜3の空欄eに関する問題です。事例1では決済APの障害によりコミット準備指示が送信されないため、再起動後は対象のトランザクションを特定し、DB側でタイムアウトまたは強制終了させる必要があります。ここではトランザクションを終了させる前段階として、全体を破棄するために「コミット実行指示」が当てはまります。
各選択肢の解説
- ア: 準備指示の段階ではありません。
- イ: 正解 コミット実行指示によって整合性を保ちます。
- ウ: ロールバック実行指示は別の状況で用いられます。
- エ: トランザクションを直接終了するのではなく、適切な指示が必要です。
(5)
事例1〜3の f に入れる適切な字句を次の中から選択して答えよ。
模範解答
選択肢ウ: ロールバック実行指示
配点 3点
解説
解説
事例1〜3の空欄fに関する問題です。コミット準備指示に対して正常に応答できなかった場合や、不定状態に陥った場合は、データの不整合を防ぐためにトランザクションを取り消す必要があります。したがって、ロールバック実行指示 が適切です。
各選択肢の解説
- ア: 準備指示は完了しています。
- イ: コミットを実行すると不整合が生じる可能性があります。
- ウ: 正解 全体を取り消すための正しい指示です。
- エ: 指示を行わずに終了するとロックが残るなどの問題があります。
(6)
事例1〜3の g に入れる適切な字句を次の中から選択して答えよ。
模範解答
選択肢エ: トランザクションを終了
配点 3点
解説
解説
事例1〜3の空欄gに関する問題です。必要な指示(コミットやロールバック)が全て完了し、各DBの状態が確定した後は、一連の処理の終結として トランザクションを終了 する必要があります。
各選択肢の解説
- ア: 既に確定フェーズにあります。
- イ: 再度のコミット実行指示は不要です。
- ウ: ロールバック実行指示も不要です。
- エ: 正解 全ての処理が完了したためトランザクションを終了します。
(7)
事例4の下線㋐について,発生したと考えられる業務上の不具合を30字以内で具体的に答えよ。
模範解答
ポイント会員が決済の完了を長時間待たされる。
同じポイント会員が決済サービスを利用できなくなる。
採点基準(配点 6点)
知識・理解度(内容)(3点)
- 3点: 排他ロックの維持による業務影響を正確に理解している。
- 1点: 影響についての理解が部分的である。
- 0点: 理解が不十分である。
論理性(構造)(3点)
- 3点: 業務上の不具合を論理的かつ具体的に記述できている。
- 1点: 不具合の説明が曖昧である。
- 0点: 論理的な説明になっていない。
解説
解説
ロックが長時間解放されないことによる業務上の不具合を問う問題です。トランザクションが保留されると、該当データの排他ロックが維持されるため、 ポイント会員が決済の完了を長時間待たされる ことや、 同じポイント会員が決済サービスを利用できなくなる といった影響が生じます。
高得点のポイント
- ロック解放待ちによるユーザへの影響を正確に理解していること - 業務上の不具合として具体的に論理的に説明できること
(8)
事例4では,最終的にデータの状態はどのようになるか。40字以内で具体的に答えよ。
模範解答
決済残高だけを消費し,ポイント残高を消費していない不正な状態
採点基準(配点 6点)
知識・理解度(内容)(3点)
- 3点: 片側コミットによるデータ不整合のメカニズムを正確に理解している。
- 1点: 不整合のメカニズムについて部分的な理解が見られる。
- 0点: 理解が不十分である。
論理性(構造)(3点)
- 3点: 最終的なデータの状態を論理的かつ具体的に記述できている。
- 1点: 記述が抽象的で具体性に欠ける。
- 0点: 不適切な説明である。
解説
解説
2相コミット中の障害によるデータ不整合を問う問題です。決済DBの更新は確定した一方で、ポイントDBの更新が完了していない場合、 決済残高だけを消費し、ポイント残高を消費していない不正な状態 となります。これはBASE特性とACID特性の違いに関わる重要なポイントです。
高得点のポイント
- 分散トランザクションの片側コミットによるデータ不整合を正確に理解していること - 最終的なデータの状態を具体的かつ論理的に記述できること
設問2では,(1)(a),(c)の正答率が低かった。2相コミットプロトコルによるトランザクションの基本的な流れに着目していない解答が散見された。(2)(b)では,一方のデータベース障害によってサービス全体が停止するとの誤った解答が散見された。2相コミットプロトコルの特徴,長所,短所について理解を深めてほしい。
設問3
〔システム変更案の検討〕について答えよ。
(1)
“3. テーブル構造及び処理の変更”について答えよ。
(a) 本文中の下線㋑について,列を追加する図2中のテーブル名,追加する列名を答えよ。また,追加するステップの適切な処理概要を40字以内で答えよ。
模範解答
決済履歴
決済指示#
“決済履歴”テーブルに決済指示#が一致する行があれば処理を終了する。
採点基準(配点 5点)
知識・理解度(内容)(3点)
- 3点: 冪等性を確保するためのテーブル設計と処理概要を正確に理解している。
- 1点: テーブル名や処理概要の一部に誤りがあるが意図は伝わる。
- 0点: 理解が不十分である。
論理性(構造)(2点)
- 2点: 必要な要素が論理的に整理され、不足なく記述されている。
- 1点: 論理構成にやや欠けがある。
- 0点: 論理的でない記述である。
解説
解説
API呼び出し時の重複処理(冪等性)を確保するための設計です。要求の重複を防ぐためには、処理済みの要求を管理する 決済履歴 テーブルに 決済指示# を追加し、処理の先頭で “決済履歴”テーブルに決済指示#が一致する行があれば処理を終了する 仕組みが必要です。
高得点のポイント
- 重複要求を防ぐためのテーブル設計(冪等性の確保)を正確に理解していること - 必要な列名と処理概要を論理的に組み立てられること
(2)
(b) 本文中の下線㋒について,処理P2及びP3の先頭に共通して追加するステップの適切な処理概要を60字以内で答えよ。
模範解答
更新中FがTRUEのときは更新中エラーを設定して処理を終了し,FALSEのときはTRUEに更新する。
採点基準(配点 5点)
知識・理解度(内容)(3点)
- 3点: フラグを用いた排他制御とエラーハンドリングを正確に理解している。
- 1点: フラグ運用の理解に一部欠けがある。
- 0点: 理解が不十分である。
論理性(構造)(2点)
- 2点: 条件に応じた処理の流れを論理的に過不足なく記述できている。
- 1点: 処理の流れの一部が論理的に飛躍している。
- 0点: 論理的な記述になっていない。
解説
解説
複数トランザクションの同時実行による競合を防ぐための排他制御(フラグ運用)の設計です。処理の開始時に 更新中F の状態を確認し、 TRUEのときは更新中エラーを設定して処理を終了し、FALSEのときはTRUEに更新する ことで、安全に処理を開始できます。
高得点のポイント
- フラグを用いた排他制御のロジックを正確に理解していること - 同時実行時のエラーハンドリングを論理的に記述できること
(3)
処理P2及びP3の末尾に共通して追加するステップの適切な処理概要を20字以内で答えよ。
模範解答
更新中FをFALSEに更新する。
採点基準(配点 5点)
知識・理解度(内容)(3点)
- 3点: フラグの解放処理の必要性と方法を正確に理解している。
- 1点: 解放処理の意図はわかるが表現に不備がある。
- 0点: 理解が不十分である。
論理性(構造)(2点)
- 2点: 簡潔かつ論理的に更新処理を記述できている。
- 1点: 記述が不明瞭である。
- 0点: 論理的な記述になっていない。
解説
解説
排他制御のために設定したフラグの解放処理です。一連の処理が完了した後は、他のトランザクションが実行できるよう 更新中FをFALSEに更新する 必要があります。
高得点のポイント
- トランザクション終了時のロック(フラグ)解放処理を正確に理解していること - ロジックを簡潔かつ論理的に記述できること
(4)
“4. 補償トランザクションの設計”について答えよ。
(a) 表8中のhに入れる適切な補償処理の概要を40字以内で答えよ。
模範解答
決済会員の“決済残高”テーブルの残高に決済金額を加算して更新する。
採点基準(配点 5点)
知識・理解度(内容)(3点)
- 3点: 補償時のデータ復旧処理(加算更新)を正確に理解している。
- 1点: 復旧対象やロジックの一部に誤りがある。
- 0点: 理解が不十分である。
論理性(構造)(2点)
- 2点: 更新対象と処理内容を論理的に関連付けて記述できている。
- 1点: 論理構成に曖昧な部分がある。
- 0点: 論理的な記述になっていない。
解説
解説
補償トランザクションによるロールバックの設計です。決済が取り消された場合、消費された決済残高を元に戻す必要があるため、 決済会員の“決済残高”テーブルの残高に決済金額を加算して更新する 処理を行います。
高得点のポイント
- 補償トランザクションの目的と具体的なデータ復旧処理を正確に理解していること - 更新対象のテーブルと計算ロジックを論理的に組み立てられること
(5)
表8中のiに入れる適切な補償処理の概要を40字以内で答えよ。
模範解答
“決済履歴”テーブルから決済指示#が一致する行を削除する。
採点基準(配点 5点)
知識・理解度(内容)(3点)
- 3点: 履歴データのクリーナップ処理を正確に理解している。
- 1点: 削除対象の特定条件に一部欠けがある。
- 0点: 理解が不十分である。
論理性(構造)(2点)
- 2点: テーブル名と削除条件を論理的に明示できている。
- 1点: 記述の構造が不明瞭である。
- 0点: 論理的な記述になっていない。
解説
解説
決済の取り消しに伴い、処理済みの履歴も元に戻す必要があります。そのため、 “決済履歴”テーブルから決済指示#が一致する行を削除する ことで、システム全体の状態を整合させます。
高得点のポイント
- 補償トランザクションによる履歴データのクリーナップ処理を正確に理解していること - 削除対象の特定条件(決済指示#の一致)を論理的に記述できること
(6)
模範解答
決済指示#, 有効期限年月
採点基準(配点 5点)
知識・理解度(内容)(3点)
- 3点: 必要な主キー構成列を過不足なく正確に答えている。
- 1点: 主キー構成列の一部が欠けている。
- 0点: 理解が不十分である。
論理性(構造)(2点)
- 2点: テーブル構造の目的に合致する列を論理的に選定している。
- 1点: 論理的な選定理由が薄い回答である。
- 0点: 論理的な選定になっていない。
解説
解説
ポイント消込履歴テーブルに補償を可能にするための主キー設計です。決済の単位と対象のポイントを正確に特定するため、 決済指示# と 有効期限年月 を組み合わせる必要があります。主キーには実線の下線を付与する形式指定があります。
高得点のポイント
- ポイント消込の履歴管理に必要な主キー構成を正確に理解していること - 実線の下線という形式指定を遵守していること
(7)
“5. 障害からの回復”について答えよ。
表9中の事例5〜7のうち,ポイントDB内のデータが一時的に不整合になる事例を一つ答えよ。
模範解答
事例7
採点基準(配点 5点)
正確性(内容)(5点)
- 5点: 正しい事例番号を選択できている。
- 2点: 関連するが不正解の事例を選択している。
- 0点: 不正解である。
解説
解説
結果整合性をベースとした分散処理におけるデータの一時的な不整合状態に関する問題です。ポイントDB内のデータが一時的に不整合となるのは、片方の更新が完了し、もう一方の補償や反映が遅延している状況である 事例7 です。
高得点のポイント
- 結果整合性における一時的な不整合が発生するシナリオを正確に理解していること
(8)
不整合の内容を50字以内で具体的に答えよ。
模範解答
取消処理が完了するまで,“ポイント残高”テーブルの残数が消費された状態になる。
採点基準(配点 5点)
知識・理解度(内容)(3点)
- 3点: 処理遅延によって引き起こされる具体的な不整合の状態を正確に理解している。
- 1点: 不整合状態の理解に一部欠けがある。
- 0点: 理解が不十分である。
論理性(構造)(2点)
- 2点: 遅延とデータ状態の関係を論理的かつ明確に説明できている。
- 1点: 説明の論理がやや不明瞭である。
- 0点: 論理的な説明になっていない。
解説
解説
事例7における一時的な不整合の具体的な内容を問う問題です。ポイントシステム側での取消処理が遅延すると、 取消処理が完了するまで、“ポイント残高”テーブルの残数が消費された状態になる という不整合が発生します。これがBASE特性における許容される一時的状態です。
高得点のポイント
- 補償トランザクションの遅延によるデータ状態を正確に理解していること - 具体的な不整合の内容を論理的に記述できること
設問3では,(1)(a)の列名及び処理概要の正答率が低かった。APIによってアプリケーションプログラムを呼び出す方式を設計する上で,アプリケーションプログラム側で要求の重複処理を防ぐ仕組みを考慮することは非常に重要である。(2)(b)については,決済指示#を主キーの一部としない解答が散見された。正確なテーブル設計を心掛けてほしい。