データの整合性を保ち、信頼性の高いシステムを作る
トランザクション処理では、一連の処理が問題なく行われた場合にだけ「成功」とみなされます。途中で何らかの問題が生じれば「失敗」と見なされ、すべての処理がキャンセルされます。それまでの操作をすべて元に戻し、データの整合性を保ちます。すべての処理が正常に行われ変更を確定させることを「コミット(commit)」、失敗して処理を取り消すことを「ロールバック(rollback)」と呼びます。
代表的な例は「金融機関における振込処理」です。銀行口座からの振込手続きは、指定金額を口座から出金して、他の口座へ入金します。「口座から出金する」処理は問題なく実行され、「他の口座へ入金する」処理が失敗した場合、出金した金額が浮いた状態になってしまいます。トランザクション処理であれば、入金が失敗すれば、出金も取り消されます。一方だけ完了して他方は未完了という状況はあり得ません。
また、オンラインショップで商品を購入した場合、在庫数が更新され、商品は減らされます。しかし、支払いが完了しなかった場合には、在庫数の変更は取り消されます。航空券や鉄道の特急券の予約に用いれば、複数の顧客が同じ席を予約しないように管理することで、予約の一貫性が確保できます。
このように、処理が途中の状態でデータベースに変更が反映されることがないため、データの一貫性が保たれます。信頼性の高いシステムを作るために、トランザクション処理は必須の技術といえます。
ただし、大量のトランザクションが同時に行われると、データベースの容量が増加して、不具合が起こる場合があります。これを避けるために、銀行やECサイト、飲食店やチケットの予約サイトなどでは、多数のトランザクション処理を効率的に行える「OLTP(オンライントランザクション処理)」が採用されています。
トランザクション処理を定義する4つの特性
トランザクション処理には「原子性(Atomicity)」「一貫性(Consistency)」「独立性(Isolation)」「永続性(Durability)」の4つの特性があります。それぞれの頭文字をとって、「ACID特性」と呼ばれています。
● 原子性(Atomicity):すべて成功するか、すべて失敗する
トランザクションは「すべて実行する」か「まったく実行しない」のいずれかで、中途半端に一部だけ実行することはありません。エラー発生時には、元の状態に戻すことでトランザクションを無効とし、データベースは変更されることなく保たれます。
● 一貫性(Consistency):データベースの状態は常に一貫性を保つ
実行前と実行後のデータベースの状態に整合性があり、一貫した規則が守られていることを指します。トランザクションの実行によって、データベースの情報が変更された場合、データの状態が矛盾しないように保たれます。
● 独立性(Isolation):他のトランザクションの影響を受けない
複数のトランザクションが同時に実行されても、トランザクション同士が干渉することありません。単独で実行した場合と同じ結果になるように、一貫性を保ちます。
● 永続性/耐久性(Durability):完了したデータは失われない
トランザクション完了後、その処理結果がデータベースに永続的に保存されます。処理内容はログに記録されており、データが破損してもログから再計算することができます。
これらの特性を保証することで、データの整合性が保たれ、信頼性の高いシステムを実現することが可能となります。
分散トランザクション処理
ネットワーク上の複数のコンピュータに分散されたトランザクションを同時に処理する方式を「分散トランザクション処理」といいます。トランザクション処理と同様に、ACIDを満たし、一連の操作に対して結果が完了するか、行われないかのどちらかになるという原子性が保証されます。
分散トランザクション処理において、データの整合性や可用性を確保するために、トランザクション処理にロック(データの整合性を保つための排他制御)を行う必要があります。ロックには、自分以外の他のタスクはデータの読み書きが一切できない「占有ロック」と、他のタスクの読み込みは可能だが書き込みはできない「共有ロック」があります。
トランザクションとブロックチェーンの関係性
トランザクションは、ブロックチェーンとも関連しています。ブロックチェーンは、複数のトランザクションを「ブロック」と呼ばれる単位にまとめ、鎖のように連結させてデータを管理する技術です。ブロックチェーンは暗号資産(仮想通貨)の基盤技術であり、トランザクションのデータの中には金額や送金先の情報が記録されています。これらのデータをブロックチェーンに書き込むことで暗号資産の動きを記録しています。トランザクションで扱うデータは「トランザクションデータ」と呼ばれることもあります。
トランザクション処理が行われるたびに、トランザクションに関する情報が新しいブロックに追加されます。新しいブロックは過去のブロックと連結され、情報の変更があった場合には、無効化するためのハッシュ値が算出されます。トランザクションの情報はブロックチェーン上で完全に公開され、改ざんされる心配はありません。
大量のデータを一括で処理する「バッチ処理」
データを効率的に処理する手法に「バッチ処理」があります。トランザクション処理がリアルタイムで行われるのに対して、バッチ処理は一定の期間に蓄積された大量のデータを一括処理します。日次・週次・月次などの定期的なレポートを生成することができ、データを集約・分析する際に役立ちます。
トランザクション処理に比べると、バッチ処理はリアルタイムでのデータ更新や反映が難しいというデメリットがあります。また、大量のデータを一括で処理するため、システムへの負荷が集中する可能性があります。
それぞれ向き不向きがあるため、システムに合った処理方法を採用することで、事業の確実性を高めることができます。
銀行のATMやオンラインショッピング、航空券や飲食店の予約、コンビニのレジなど、トランザクション処理は、私たちの日常生活の中でよく使われています。トランザクション処理によって、さまざまなシステムが正常に機能し、日常生活を支えているといっても過言ではありません。