長年書類を書き続けて待ち続けた末に、ついに銀行の免許を取得しました。これで正式に、自分の銀行を開く資格を得たことになります。やった!
まず取りかかるのは、ITシステムを動かすことです。1日がんばったおかげで、もう口座の開設と閉鎖、そして引き出しと預け入れまでできるようになりました。
テストを書くのは面倒だったので、友達に声をかけてシステムのテストを手伝ってもらいます。ところが、始めてからわずか5分で、友達の一人がお金がなくなったと言い出しました! 自分のコードにバグはないと確信していますが、念のためログを調べて原因を探ることにします。
ああ、やっぱり。疑ったとおり、悪いのは友達のほうでした! その友達はテスト用の認証情報を別の友達と共有していて、二人で結託して同じ口座から_並行して_預け入れと引き出しを繰り返していたのです。いったい誰がそんなことをするでしょうか?
誰かが同時に自分の口座にアクセスするのは物理的に_不可能_だと主張しますが、友達は得意げに、銀行のルールではそれをサポートすることが_必須_だと告げます。つまり、並行処理をサポートしなければ、サービス開始のゴーサインは出ないということです。ため息をつきながら、明日取りかかろうと心にメモします。これでサービス開始は_少なくとも_あと1日は延びますが、まあ仕方ありません…
開設・解約、引き出し、入金を扱える銀行口座を実装するのが、この演習の課題です。
銀行口座には、インターネットや携帯電話、自動引き落としなど、さまざまな方法でアクセスできます。そのため、銀行のソフトウェアでは、複数のスレッドやプロセス(スレッドと呼ぶかプロセスと呼ぶかは、使うプログラミング言語によって異なります)から並行して安全に口座へアクセスできるようにしなければなりません。たとえば、入金と引き出しが並行して数多く発生することがあります。口座残高を読み取ってから新しい残高を設定するまでの間に競合状態が起きないようにする必要があります。
口座は解約できるようにしてください。解約済みの口座に対する操作は、必ず失敗しなければなりません。