トランザクションとは?
言葉の意味やIT分野での活用例を解説
皆さんはトランザクションという言葉をご存知でしょうか。トランザクションとは「形式化された一連の動作」を指す、ITや金融の分野において頻出するキーワードの1つです。
一方で、言葉自体は聞いたことはあるけれど、上手く説明できないという方も多いのではないでしょうか。
そこで今回はトランザクションの言葉の意味や、どのようなシーンで活用されているのかを詳しく解説します。
トランザクションは、英語では「transaction」と表記します 。商取引、売買、執行、取扱、議事録などの意味を持つ英単語が語源で、ビジネスや金融、またはITの分野で使われています。
ただし、文脈によってその意味が変わるため注意が必要です。
IT分野におけるトランザクションは、複数の処理をひとかたまりにした単位やデータを意味します。データベースシステムや業務用ソフトウェアなどでよく用いられる概念でもあります。
また、トランザクションで扱うデータは「トランザクションデータ」と呼ばれることもあります。
似たような言葉に「トランザクション処理」があります。
後述のIT分野における「トランザクション処理」とは?で詳しくお伝えしますが、概念として捉えられるトランザクションに対し、トランザクション処理は具体的な処理方式として使われることが大きな違いです。
ビジネス分野におけるトランザクションは「商取引」を意味します。
具体的には商品の購入や売却、支払いや受取、取引における個々の行為そのもののことです。
例えば、商品の「購入」と「支払い」という2つの行為がトランザクションとして定義され、どちらもクリアしなければ取引自体は成立することはありません。
ビジネスにおけるトランザクションは、円滑な取引に欠かすことができない概念です。また正確かつ安全な処理・対応が求められるものでもあり、時には取引がうまいくいかない場合に、中断させられる事も必要となります。
前述の通りIT分野におけるトランザクションは、処理の結果をデータとして残すことになるため、主にデータベース管理システムで重要な役割を果たす概念です。また、途中で処理をやめた時に、どうなるかも重要です。
具体的な処理方式として使われる、トランザクション処理についても触れました。ここではIT分野におけるトランザクション処理について、より具体的にわかりやすくお伝えします。
トランザクション処理は、トランザクションの特性に基づいて複数の処理をまとめて管理・干渉する処理方式です。データベースシステムや業務用ソフトウェアなどで広く用いられています。
トランザクション処理を銀行の振込処理で例えると、A口座(残高50,000円)から20,000円をB口座(残高20,000円)に振り込む場合、以下の2つの処理が発生します。
例で挙げた2つの処理を独立させたとしましょう。そして 、①の処理が行われ、②の処理が失敗していたとします。
その場合、A口座からB口座に振り込まれるはずだった20,000円が浮いた状態になってしまいます。これではA口座から引き出された20,000円が消失したことになり、2つの処理を独立させるのは、不整合な処理が派生するリスクがあることがわかります。
そこで登場するのがトランザクション処理です。2つの処理をひとかたまりにし、いずれの処理も成功しないと全体として成功した状態にならないようにします。②の処理が失敗した場合には、①の処理は取り消されます。
トランザクション処理を行うことで、一方が成功し一方が失敗するといったケースが無くなります。先ほどの例では、A口座から引き出された20,000円が消失してしまう事態を避けられるわけです。
このようにトランザクション処理は、安心できる処理方法ですが、処理の工程を詰め込みすぎると、処理する時間が長くなり、エラーが発生する可能性が上がります。結果「失敗」の回数が増えてしまう恐れがあるため、注意が必要です。
トランザクション処理の結果は、「成功」か「失敗」しかなくシンプルです。
そこでポイントとなるのが、トランザクションの特徴である「原子性」「一貫性」「永続性」「独立性」の4つの特性です。4つの特性についてそれぞれの解説は、トランザクション処理の4つの特性 で記述しますが、信頼性の高いシステムを構築する上で必須となる概念です。
トランザクション処理は、処理の完了を保証します。これは、複数のデータ処理ステップがある場合に、全てのステップを完了するか、またはどれか一つでも失敗するとロールバック(やり直し)され、実行前の状態に戻るためです。すなわち、確実に処理を無かったことにできるのです。
また、処理が途中の状態でデータベースに反映されることはないため、データの一貫性を保つこともできます。
ただし、一連の操作を完了するまで、データベースのメモリやディスク容量を占有し続けることになります。そのため、大量のトランザクションが同時に発生すると、メモリやディスク容量などの使用量が増加するというデメリットがあります。例えば、チケットの購入などで、大量のトランザクションが発生すると、不具合が起こる場合があります。ただし、後述するOLTP(オンライン・トランザクション処理)を利用することで、この問題は回避できます。
前項で触れた通り、トランザクション処理には4つの特性があります。
「原子性(Atomicity)」「一貫性(Consistency)」「独立性(Isolation)」「永続性(Durability)」の4つで、それぞれの頭文字をとってACID特性と呼ばれます。
ここではそれぞれの特性について、詳しく解説していきます。
原子性はトランザクションの全ての操作が完了するか、もしくは全ての処理が失敗するかのどちらかであるという特性です。
前述の通り、トランザクション処理は成功か失敗のどちらかしかなく、中途半端に一部だけ実行することはありません。
万が一、トランザクションの処理中にエラーが発生し処理が中断された場合、その処理の途中までの結果をデータベースに反映するのではなく、元の状態に戻すことでトランザクションを無効にします。
このように原子性の特性があることで、データベースの情報で不整合が起こらなくなります。
一貫性は、トランザクションの実行前後でデータベースの状態が整合的であるという特性です。これは、エラーのない状態にあるということです。データベースのデータに、矛盾を生じさせるようなことはあってはなりません。
そこで、矛盾を生じさせずにデータ管理をするため、トランザクション処理が成功し、完了した後は、実行前の状態に戻ることはない、という特徴があります。
また、トランザクション処理を行う際、一定のルールに基づいて処理が進んでいきます。例えば、「データベース内の計算は正の数で管理する」として定義されている場合、負の数で計算が行われることはありません。 負の数で計算した時に、確実にエラーになります。
独立性は、他のトランザクションの影響を受けない特性です。トランザクション処理では、複数のトランザクションを同時に実行した場合でも、単独実行の場合と同じ処理結果にならなければいけません。
もし、トランザクション処理に独立性の特性が無い場合、他のトランザクション処理による数値の変更の影響を受け、処理が失敗する可能性が出てきます。しかし、トランザクション処理に独立型の特性があることで、データベースの情報は一貫性を保ち、エラーを起こさずに並行処理を行うことができます。
トランザクション処理の永続性は、トランザクションが成功した場合に、その結果は永続的に保存されるというものです。
トランザクションの実行過程はログに記録されているため、例えシステム障害や電力の喪失などが発生しても完全に失われることはありません。ログを元に再計算が行えます。
永続性の特性があることで、トランザクションはデータの整合性を保つことができるわけです。
複数のトランザクションを同時に実行するデータ処理の一種を、OLTP(Online Transaction Processing)と言います。
身近なサービスでも実行されており、ATMやオンラインバンキング、レジ、ネットショッピングなど実にさまざまな場面で使われています。大量のトランザクションを直接データベースで処理すると、処理しきれない状態に陥ることがあります。これを避けるために、データベースにOLTPを入れることで、適切に処理できるようになります。OLTPは、大量のトランザクションを適切に捌いてくれるのです。また、パスワードの変更やSMSメッセージの送信などのデータ処理においても活躍しています。
さらに、OLTPが実装されていれば、単一データを複数のユーザーが同時に編集する場合も、適切な順序でトランザクションを実行できます。
例えば、オンライン予約システムにおける同一客室への予約重複や、共同名義の銀行口座における偶発的な残高超過の発生を避けることができます。
トランザクション処理は、データベース管理システムにおいてさまざまなサービスで実行されています。
ここではトランザクション処理を活用した事例を4つ紹介します。
トランザクション処理は、振込や預金の引き落としなど銀行取引でも活用されています。
前述の通り、お金の振込などの取引は一連の操作で構成されます。
トランザクション処理を行うことで、双方の口座間での金額の整合性が保たれます。そのため、万が一不具合が生じた場合、送金がキャンセルされることが保証されています。
トランザクション処理は、オンラインショップの商品購入の際にも活躍しています。
商品購入の際に支払いが完了すれば在庫数が更新され商品が減ります。逆に支払いが完了していなければ、在庫数の変更を取り消せるという仕組みです。
このように商品の出庫や発注などがトランザクションとして定義され、在庫操作に役立ちます。
ホテルや航空会社の予約システムで予約を行うと、予約枠が確保され、予約情報がデータベースに保存されます。その際に、トランザクション処理を用いることで座席の重複予約の防止や支払いの整合性を確保できるわけです。
また、チケット予約の際に途中でエラーが発生しても、選択していたもののチェックを外す処理が行われます。 これにより誤った決済や、個人情報の登録が防止されます。
トランザクションIDとは、簡単に言うと、暗号資産アドレスから他の暗号資産アドレスにどのくらいの暗号資産が送られたかを表す、固有の取引IDのことです。
このトランザクションIDを用いることで、成約が重複してカウントされるような事態を回避できます。
また、暗号資産をトランザクション処理で管理する際、データの改ざんを感知できる「ブロックチェーン」という技術と組み合わせて活用されています。
ブロックチェーンは、スマートコントラクト(ブロックチェーン上での契約の処理を自動化できる仕組み)と呼ばれる方法で処理を実行します。処理の途中で失敗し、整合性の取れない内容になることを避けるために、ブロックチェーンに合わせ、トランザクション処理も実装されています。
ブロックチェーンについて詳しくは、「ブロックチェーンとは?仕組み・種類・実装のメリットを初心者向けに解説!」をご覧ください。
また、暗号資産以外にもトランザクションIDが活用されている具体例に、クレジットカードの取引記録の管理が該当します。
クレジットカードは、トランザクションIDにより、取引内容の一連操作を管理・保存しています。例えば、ユーザーは取引内容をチェックする際にトランザクションIDを使用しており、取引のダブルカウントの防止などに役立っています。
ここではトランザクション処理に関連するワードについて説明します。
前述したように、トランザクション処理の結果は失敗か成功しかありません。データベースにおいて、トランザクションが正常に完了したことを示す処理を「コミット (COMMIT)」と言います。
トランザクション処理の原子性と永続性を保証するために欠かせないものです。コミット処理されたトランザクションは、永続的な変更となります。
トランザクションが正常に完了したコミットに対し、失敗した際に変更されたデータを元に戻すことを「ロールバック」と言います。
ロールバック処理により、トランザクションの不完全な実行や誤った結果がデータベースに反映されることを防ぐことができます。これによりトランザクション処理の原子性を保証することが可能です。
「保存点」は、トランザクション内の特定の地点で設定されるマークです。
これを使用することで、トランザクション途中でのロールバックをより制御的に行うことができます。
「並行制御」は「同時実行制御」とも呼ばれるもので、複数のトランザクションが同時に実行される際に、データの整合性を保つための制御手法です。
データの整合性を確保し、プログラムの安全性を向上させることが目的です。そのため規則、技法、設計方法論、理論を提供しシステム全体の一貫性と正確性を担保します。
「トランザクション分離レベル」は、データベース内で複数のトランザクション処理を同時に実行する際、どの程度の独立性を保証できるかを表すものです。
並行したトランザクション処理には、「ダーティーリード」と呼ばれる、未確定のデータを他のトランザクションが読み込んでしまう現象が発生することがあります。ダーティーリードを防ぐために、トランザクション分離レベルを高めることは有効です。
ただし、トランザクションの並行性と独立性は完全に両立できない関係にあるため、完全な独立性を求めてしまうと並行に処理できなくなる可能性に注意が必要です。
「デッドロック」は行き詰まりや、手詰まり、こうちゃく状態といった意味をもつ英単語です。トランザクション処理においては、処理時に複数のトランザクションがお互いにリソースを保持し続けて処理が進行しなくなる状態を意味します。
2つのトランザクションで同じデータベースのデータを同時に更新しようとすると、どちらも「結果待ち」の状態になりロックされることがあります 。 例えば、口座Aから口座Bへの振り込みと、口座Bから口座Aの振り込みが同時に発生した場合、お互いに処理待ちの状態になり、処理が進まなくなります。
ロックが解除されるまでは、どちらのトランザクション処理も進まなくなってしまいます。デッドロックが発生すると、トランザクションの実行が停止し、システム全体の処理が滞る可能性もあります。
「SQL」とはStructured Query Language(ストラクチャード クエリ ランゲージ)の略で、データベース管理システムで使用される標準的な言語です。
データベースを管理するソフトウェアを操作・制御することが目的として使用されます。プログラミング言語ではないので、SQLだけで画面などのあるシステムを開発することはできません。
「SQLクエリ」は、前述したSQLの実行時に送信される命令文のようなものです。SQLクエリには大きく分けて、4つの種類があります。
ほとんどのデータベースでは、トランザクション処理をSQLクエリで書けるようになっています。データベース管理システムに対して発行することで、データベース上のデータを操作することができます。
「TPモニタ」はTransaction Processing Monitor(トランザクション プロセシング モニタ)の頭文字をとったもので、トランザクション処理を監視するためのツールです。
トランザクション処理の実行状況や、エラーの有無などをリアルタイムでモニタリングすることができます。またエラーが発生した際の分析や、トランザクションの再実行やロールバックも可能です。
TPモニタには以下のように4つの管理機能があります。
多くの企業や組織がTPモニタを活用し、メモリの増設などの適切な解決を行い、トランザクション処理システムのパフォーマンスと安定性を確保しています。
ここでは、SQLを使った「BEGIN」「COMMIT」「ROLLBACK」のコマンド指示について解説します。それぞれのコマンドの意味は以下の通りです。
BEGIN (BEGIN;) |
トランザクション処理を開始する指示 |
---|---|
COMMIT (COMMIT;) |
トランザクション処理を終了する指示 終了した際、変更を確定する |
ROLLBACK (ROLLBACK;) |
トランザクション処理を終了する指示 終了した際、変更を確定せず取り消しにする |
BEGINとCOMMITを使ったコード(トランザクション処理を開始し、終了・確定するまでのコード)は以下のように書かれます。
次に、BEGINとROLLBACKを使用したコード(トランザクション処理を開始し、終了・取り消しするまでのコード)の使用例は以下の通りです。
複数の処理をひとかたまりにした単位やデータを意味するトランザクション。また、トランザクションを使用し、具体的な処理方式として使えわれるのがトランザクション処理です。
これには原子性(Atomicity)一貫性(Consistency)独立性(Isolation)永続性(Durability)の4つの特性があり、 頭文字を取ってACID特性と呼ばれます。
日常生活の中で馴染みのあるシステムでもよく使われており、ATMやオンラインショッピング、コンビニのレジなど実にさまざまです。
トランザクション処理によってシステムが正常に機能し、さまざまなシステムを安心・安全に利用できるのです。
当記事を通して、トランザクションについて少しでも理解を深めていただければ幸いです。