データベースにおけるトランザクションとは、データベースに対する一連の操作(データの追加/更新/削除)をひとまとめにしたものです。
参考 データベースとは?
トランザクションの概念は、DBの世界において極めて重要で、データの整合性を保つために不可欠な役割を果たしています。
私たちの生活における一つの行動、例えばお金をATMから引き出す行為は、口座から金額が引き出され、手元に現金が出てくるという一連の操作がまとまったトランザクションとして扱われます。これらの操作が一つにまとまっていなければ、混乱が生じます。
このページでは、このトランザクションの重要性とその基本的な特性について詳しく見ていきます。トランザクションの理解は、ITの知識を深め、システムを理解する上で重要な一歩となりますので、一緒に学んでいきましょう。
プログラマーやエンジニアを目指す方であれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。
トランザクションとは?
トランザクションとは、複数の処理をひとつのまとまりとして取り扱う手段(具体的には・・・データベースに対する一連の操作(データの追加/更新/削除)をひとまとめにしたもの)のことを指します。
「トランザクション」は、コンピュータの世界において、特にデータベースシステムにおける重要な概念の一つ。
例えば、銀行の送金処理を考えてみましょう。あるユーザーAがユーザーBにお金を送金する場合、以下の2つの操作が必要です。
ステップ1 ユーザーAの口座から送金額を引き落とす。
ステップ2 ユーザーBの口座に送金額を加算する。
これら2つの操作は、どちらも成功するか、どちらも失敗するかのどちらかでなければなりません。もし1つ目の操作が成功して2つ目の操作が失敗した場合、お金が消失することに。逆の場合はお金が誕生してしまうことになります。
お金が消失したり、逆に増えたりするようなことを避けるために利用されるのがトランザクション。上記2つの処理のまとまりを1つのトランザクションとしてまとめ、どちらか一方だけが成功してしまうなどのデータベース内での不整合を防ぐことが可能になります。
トランザクションの基本的な特性
トランザクションはその動作の特性から、以下の4つの基本的な特性を持ちます。これらは「ACID特性」と呼ばれ、全てのトランザクションがこの特性を満たすべきだとされています。
特性 | 説明 |
---|---|
一貫性 (Consistency) | トランザクションがデータベースに対する操作を行う前と後で、そのデータの整合性(一貫性)が保たれること。一貫性が保たれることで、データベース全体が一定のルールや制約を守った状態を保つことが保証されます。 |
原子性 (Atomicity) | トランザクション内の全ての操作が全て成功するか、あるいは全て失敗する(すなわち何も行われなかったことになる)こと。これは「全てか無し」の原則とも言われ、一部だけが実行されるという状態は存在しません。 |
分離性 (Isolation) | 同時に複数のトランザクションが行われている場合でも、各トランザクションが他のトランザクションから独立しているかのように動作すること。これにより、複数のトランザクションが同時に行われても、それらが互いに干渉することなく、正確な結果を得ることができます。 |
耐久性 (Durability) | 一度成功したトランザクションの結果は永続的に保存され、システム障害が起きた場合でもその結果は失われないことを保証します。 |
これらの特性は、トランザクションがデータベースシステムで重要な役割を果たす理由を明確に示しています。これらを満たすことで、トランザクションはデータの一貫性と整合性を保つことができ、信頼性の高いシステムを構築するための基盤となります。
ACID特性はデータベーススペシャリスト試験を始めとして様々な試験でも出題される理解必須の超・基本知識です。以下の記事で詳しく解説しておりますので、ここで丁寧に学習しておきましょう。
トランザクションの利点と注意点
最後にトランザクションの利点、注意点についてご説明します。
トランザクションの利点
- データ整合性の維持
- 同時アクセスの管理
- 耐障害性の確保
トランザクションの最大の利点。それは、データベースの整合性を担保することができる点です。原子性と一貫性の特性により、全ての操作が正常に完了するか、全てが行われなかったことにする保証をすることができるためです。
また、分離性により、複数のユーザーまたはシステムが同時にデータベースにアクセスしても、各トランザクションは独立して操作できること、一度成功したトランザクションの結果は、耐久性により永続的に保持される点も大きな利点の1つ。
ただし、トランザクションを適切にコントロールしないと以下のような弊害もあります。
トランザクションの欠点
- パフォーマンスの低下
- デッドロックの発生
トランザクションが保証するデータ整合性と安全性は、パフォーマンスの低下と引き換えに得られることが一般的です。整合性・安全性を重視すればするほど、その担保のためにシステムの稼働が上がっていくためです。
特に、大量のデータを扱う大規模なトランザクションでは、その実行に時間がかかり、システムの応答性が低下する可能性があります。
また、トランザクションの実行中に、複数のプロセスが同じリソースに同時にアクセスしようとすると、デッドロック(相互ブロック)状態が発生する可能性があります。これはシステムのパフォーマンスを大幅に低下させ、最悪の場合、システムが停止する原因となります。
これらの利点と欠点を理解することで、適切な状況でのトランザクションの使用や、その設計と管理の最適化に役立ちます。
実際のトランザクション管理の例
最後に、ここで説明したトランザクションがどのように実際のプログラムの中で管理されているか?をご説明します。
以下では3つの簡単な例を紹介します。それぞれがどのようなことを目的としているのか、なんとなく理解できればこのページの解説はOKです。
サンプル1 PythonでのSQLiteのトランザクションの例
# Pythonのsqlite3モジュールをインポートします。 import sqlite3 # データベースに接続します。 conn = sqlite3.connect('test.db') # カーソルを取得します。 c = conn.cursor() # トランザクションを開始します。 c.execute("BEGIN TRANSACTION;") try: # データを挿入します。 c.execute("INSERT INTO stocks VALUES ('2023-08-01', 'BUY', 'RHAT', 100, 35.14);") c.execute("INSERT INTO stocks VALUES ('2023-08-01', 'SELL', 'GOOG', 50, 1000.53);") # トランザクションをコミットします。 conn.commit() except: # エラーが発生した場合、ロールバックします。 conn.rollback() # 接続を閉じます。 conn.close()
参考 Python:クラス / try-except文
サンプル2 MySQLでのトランザクションの例
-- MySQLへの接続を開始します。 START TRANSACTION; -- データの更新を試みます。 UPDATE account SET amount = amount - 100 WHERE name = 'John'; UPDATE account SET amount = amount + 100 WHERE name = 'Mary'; -- 変更を確認します。 COMMIT;
参考 START TRANSACTION / UPDATE文
サンプル3 JavaでのJDBCを使用したトランザクションの例
// JavaのJDBCを使用してデータベースに接続します。 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "password"); try { // トランザクションを開始します。 conn.setAutoCommit(false); // ステートメントを作成します。 Statement stmt = conn.createStatement(); // データを更新します。 stmt.executeUpdate("UPDATE account SET balance = balance - 100 WHERE name = 'John';"); stmt.executeUpdate("UPDATE account SET balance = balance + 100 WHERE name = 'Mary';"); // トランザクションをコミットします。 conn.commit(); } catch (SQLException e) { // エラーが発生した場合、ロールバックします。 conn.rollback(); }
これらの例は、トランザクションを使った基本的な操作を示しています。PythonとSQLite、MySQL、JavaとJDBCを使った例で、どれも同じようにトランザクションを開始し、操作を行い、最後にコミットするかロールバックするという流れが見て取れます。
このような基本的なフローを理解しておくと、トランザクションを利用したプログラミングが容易になります。