トランザクションとは?活用例などをわかりやすく解説

トランザクションとは、データベースの処理単位のことである。

複数の処理を1つにまとめることで、処理の整合性を保つことができる。ITシステムにおいて重要な概念であり、金融、EC、物流など、さまざまな分野で活用されている。




トランザクションの概要

トランザクションとは、データベースの処理単位のことである。複数の処理を1つにまとめることで、処理の整合性を保つことができる。

例えば、商品の購入処理では、商品の在庫を減らす処理と、顧客の口座から代金を引き落とす処理の2つを行う必要がある。これらの処理を1つのトランザクションとしてまとめることで、商品の在庫が減ったのに代金が引き落とされない、といった不整合を防ぐことができる。

トランザクションのACID特性

トランザクションは、「ACID特性」と呼ばれる次の4つの特性を満たす必要がある。

原子性(Atomicity)

原子性とは、トランザクションの処理は、すべて成功するか、すべて失敗するかのどちらかであるという特性である。

例えば、顧客情報を更新するトランザクションにおいて、顧客情報の更新だけでなく、在庫情報の更新も同時に行う必要がある場合、原子性がなければ、顧客情報は更新されたが、在庫情報は更新されなかったという状態が発生する可能性がある。

原子性を確保するためには、データベース管理システム(DBMS)は、トランザクションの処理がすべて完了するまで、データの変更を永続的に保存しないという処理を行う必要がある。

一貫性(Consistency)

一貫性とは、トランザクションの処理が完了した後、データベースは整合性を保つという特性である。

整合性とは、データベースのすべてのデータが正しい値を持つ状態である。

例えば、顧客情報を更新するトランザクションにおいて、顧客情報が更新された後、在庫情報も更新された場合、更新後の顧客情報と在庫情報は整合性を保っていなければならない。

一貫性を確保するためには、トランザクションの処理が完了する前に、データベースの整合性をチェックする必要がある。

分離性(Isolation)

分離性とは、トランザクションは、他のトランザクションの影響を受けず、独立して実行されるという特性である。

例えば、複数のユーザーが同じ商品の在庫情報を更新する場合、分離性がなければ、あるユーザーが商品の在庫情報を更新している間に、他のユーザーが同じ商品の在庫情報を更新してしまい、在庫情報が正しくない値になってしまう可能性がある。

分離性を確保するためには、DBMSは、複数のトランザクションが同じデータを同時に操作する際に、競合状態が発生しないようにする必要がある。

永続性(Durability)

永続性とは、トランザクションの処理が完了した後、データベースへの変更は永続的に保存されるという特性である。

例えば、顧客情報を更新するトランザクションにおいて、トランザクションの処理が成功した後、システム障害が発生した場合、データベースへの変更が失われてしまうと、顧客情報は更新されなかったという状態になってしまう。

永続性を確保するためには、DBMSは、トランザクションの処理が完了した後、データの変更を永続的に保存する必要がある。

トランザクション分離レベル

ACID特性のうち、独立性(Isolation)は、複数のトランザクションが同時に実行された場合、それらのトランザクションが互いに干渉しないようにするためのものである。トランザクションの独立性を表すレベルを、トランザクションの分離レベルと呼ぶ。

読み取り未コミット(READ UNCOMMITTED)

このレベルでは、他のトランザクションによってまだコミットされていないデータも読み取ることができる。そのため、他のトランザクションによって変更されたデータが、まだ反映されていない状態になる可能性がある。

読み取りコミット(READ COMMITTED)

このレベルでは、他のトランザクションによってコミットされたデータのみ読み取ることができる。そのため、他のトランザクションによって変更されたデータは、必ず反映された状態になる。

再現可能読取(REPEATABLE READ)

このレベルでは、トランザクションの開始時と同じデータのみ読み取ることができる。そのため、他のトランザクションによって変更されたデータは、トランザクションの実行中に反映されることはない。

SERIALIZABLE

このレベルでは、トランザクションの実行順序を保証する。そのため、他のトランザクションによって変更されたデータは、トランザクションの実行中に反映されることはなく、必ずコミットされた後に反映される。

トランザクションの分離レベルは、アプリケーションの要求に応じて適切に選択する必要がある。

読み取り未コミット

読み取り未コミットでは、他のトランザクションによってまだコミットされていないデータも読み取ることができる。そのため、他のトランザクションによって変更されたデータが、まだ反映されていない状態になる可能性がある。

読み取り未コミットは、パフォーマンスを重視するアプリケーションでよく利用される。また、データの整合性がそれほど重要ではないアプリケーションでも利用される。

読み取りコミット

読み取りコミットでは、他のトランザクションによってコミットされたデータのみ読み取ることができる。そのため、他のトランザクションによって変更されたデータは、必ず反映された状態になる。

読み取りコミットは、データの整合性が重要であるアプリケーションでよく利用される。

再現可能読取

再現可能読取では、トランザクションの開始時と同じデータのみ読み取ることができる。そのため、他のトランザクションによって変更されたデータは、トランザクションの実行中に反映されることはない。

再現可能読取は、データの整合性が非常に重要であるアプリケーションでよく利用される。

SERIALIZABLE

SERIALIZABLEでは、トランザクションの実行順序を保証する。そのため、他のトランザクションによって変更されたデータは、トランザクションの実行中に反映されることはなく、必ずコミットされた後に反映される。

SERIALIZABLEは、データの整合性が絶対的に重要であるアプリケーションでのみ利用される。

トランザクションの分離レベルは、アプリケーションの要求に応じて適切に選択する必要がある。

トランザクションの処理方法

コミット(Commit)

コミットとは、トランザクションの処理がすべて成功した場合に、データベースへの変更を永続的に保存する処理である。

コミットが行われると、トランザクションの処理が完了し、データベースの整合性が保たれる。

ロールバック(Rollback)

ロールバックとは、トランザクションの処理がすべて失敗した場合に、データベースへの変更をすべて元に戻す処理である。

ロールバックが行われると、トランザクションの処理が開始された状態に戻り、データベースの整合性が保たれる。

ロック(Lock)

ロックとは、データベースのデータを排他的に使用するために、DBMSがかける制限である。

ロックをかけることで、他のトランザクションが同じデータを同時に操作することを防ぐことができる。

ロックの解除(Unlock)

ロックの解除とは、トランザクションの処理が完了した際に、ロックを解除する処理である。

ロックの解除が行われることで、他のトランザクションがロックされていたデータを操作することができるようになる。

トランザクションの活用例

顧客情報の更新

顧客情報の更新では、顧客情報の更新だけでなく、在庫情報の更新も同時に行う必要がある場合がある。このような場合、トランザクションを用いることで、両方の処理が成功するか、両方の処理が失敗するかのどちらかになるようにすることができる。

商品の購入

商品の購入では、顧客情報の更新だけでなく、在庫情報の更新も同時に行う必要がある場合がある。このような場合、トランザクションを用いることで、顧客情報が更新され、在庫数が減ったという状態になるようにすることができる。

銀行の取引

銀行の取引では、預金の引き出しだけでなく、口座残高の更新も同時に行う必要がある場合がある。このような場合、トランザクションを用いることで、預金が引き出され、口座残高が減ったという状態になるようにすることができる。

オンラインショッピング

オンラインショッピングでは、商品の購入だけでなく、配送先情報の更新も同時に行う必要がある場合がある。このような場合、トランザクションを用いることで、商品が購入され、配送先情報が更新されたという状態になるようにすることができる。

トランザクションの例

トランザクションは、システムにおいてはSQLを使用したデータベース処理で頻繁に使われる。以下にSQLを使用したトランザクションの具体例を挙げる。

顧客の購入処理

顧客が商品を購入する場合、まず商品の在庫を減らし、次に顧客の口座から代金を減らすという2つの操作を行う必要がある。この2つの操作は、同時に実行される必要がある。また、どちらかの操作が失敗した場合は、両方の操作をロールバックする必要がある。

SQL

-- 商品の在庫を減らす
UPDATE product
SET quantity = quantity - 1
WHERE product_id = 1;

-- 顧客の口座から代金を減らす
UPDATE account
SET balance = balance - 10000
WHERE account_number = 1234567890;

これらのSQLでは、COMMIT文を実行するまで、変更はデータベースに反映されない。そのため、どちらかの操作が失敗した場合は、ROLLBACK文を実行して、変更を元に戻すことができる。

銀行の預金引き出し処理

顧客が預金を引き出す場合、まず顧客の預金残高を減らし、次に顧客に現金を渡すという2つの操作を行う必要がある。この2つの操作は、同時に実行される必要がある。また、どちらかの操作が失敗した場合は、両方の操作をロールバックする必要がある。

SQL

-- 顧客の預金残高を減らす
UPDATE account
SET balance = balance - 10000
WHERE account_number = 1234567890;

-- 顧客に現金を渡す
UPDATE transaction
SET amount = 10000
WHERE transaction_id = 1234567890;

これらのSQLでも、COMMIT文を実行するまで、変更はデータベースに反映されない。そのため、どちらかの操作が失敗した場合は、ROLLBACK文を実行して、変更を元に戻すことができる。

商品の在庫管理

商品の在庫を管理する場合、商品の入荷や出荷などの操作を行う必要がある。これらの操作は、同時に実行される可能性がある。また、いずれかの操作によってデータの整合性が失われる可能性がある。

SQL

-- 商品の入荷
UPDATE product
SET quantity = quantity + 10
WHERE product_id = 1;

-- 商品の出荷
UPDATE product
SET quantity = quantity - 10
WHERE product_id = 1;

これらのSQLでは、SELECT文を使用して、商品の在庫残高を取得し、その値とUPDATE文で指定する値を比較することで、データの整合性を保つことができる。

例えば、商品の出荷の操作を行う場合は、以下のSQLを使用することができる。

SQL

-- 商品の在庫残高を取得する
SELECT quantity
FROM product
WHERE product_id = 1;

-- 商品の在庫が10以上であれば、出荷を行う
IF (quantity >= 10) THEN

  -- 商品の出荷
  UPDATE product
  SET quantity = quantity - 10
  WHERE product_id = 1;

  -- トランザクションをコミットする
  COMMIT;

ELSE

  -- 商品の出荷は失敗する
  ROLLBACK;

END IF;

このSQLでは、IF文を使用して、商品の在庫残高が10以上であれば、出荷を行うようにしている。また、商品の出荷が失敗した場合は、ROLLBACK文を実行して、変更を元に戻すようにしている。

まとめ

トランザクションとは、データベースの処理単位のことである。複数の処理を1つにまとめることで、処理の整合性を保つことができる。ITシステムにおいて重要な概念であり、さまざまな分野で活用されている。

トランザクションの特性(ACID特性)を理解することで、トランザクションの処理の仕組みをより深く理解することができる。

タイトルとURLをコピーしました