読み込み中...

PHPトランザクションをマスター!初心者向けの5つのステップ

PHPでトランザクションを実装する初心者向けチュートリアル PHP
この記事は約5分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、PHPでトランザクションを使いこなすことができるようになります。

初心者向けに、トランザクションの基本から応用例まで、サンプルコードを交えてわかりやすく解説していきます。

●トランザクションとは

トランザクションとは、データベース操作の一連の流れをひとまとめにしたもので、一部の処理が失敗した場合に、それまでの処理をすべてキャンセル(ロールバック)することができます。

これにより、データの整合性を保つことができます。

●PHPでのトランザクションの使い方

PHPでトランザクションを使うには、次の3つのステップが必要です。

  1. トランザクションの開始
  2. トランザクションのコミット(確定)
  3. トランザクションのロールバック(キャンセル)

それぞれのステップについて、サンプルコードを見ながら解説していきます。

○サンプルコード1:トランザクションの開始

トランザクションはbeginTransactionメソッドで開始します。

この例では、PDO(PHP Data Objects)を使ってデータベースに接続し、トランザクションを開始しています。

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    $dbh->beginTransaction();
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

○サンプルコード2:トランザクションのコミット

トランザクション内の処理が全て正常に終了した場合、commitメソッドで確定します。

この例では、2つのUPDATE文を実行し、その後でコミットしています。

try {
    $dbh->exec("UPDATE accounts SET amount = amount - 100 WHERE name = 'John'");
    $dbh->exec("UPDATE accounts SET amount = amount + 100 WHERE name = 'Mary'");
    $dbh->commit();
} catch (PDOException $e) {
    $dbh->rollback();
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

○サンプルコード3:トランザクションのロールバック

途中で何らかのエラーが発生した場合、rollbackメソッドでそれまでの処理をキャンセルします。

この例では、UPDATE文でエラーが発生した場合にロールバックしています。

try {
    $dbh->exec("UPDATE accounts SET amount = amount - 100 WHERE name = 'John'");
    $dbh->exec("UPDATE accounts SET amount = amount + 100 WHERE name = 'Mary'");
    $dbh->commit();
} catch (PDOException $e) {
    $dbh->rollback();
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

●トランザクションの注意点と対処法

トランザクションを扱う際には、デッドロックの回避や分離レベルの設定など、いくつかの注意点があります。

○デッドロックの回避

デッドロックは2つ以上のトランザクションが互いに必要なリソースをロックし合ってしまい、どちらも進めなくなる状態を指します。

これを回避するには、トランザクションの長時間化を避け、必要なリソースのロック順序を統一するなどの対策が必要です。

○分離レベルの設定

分離レベルは、複数のトランザクションが同時に実行される際のデータの見え方を制御する設定です。

分離レベルを適切に設定することで、データの一貫性を保つことができます。

●PHPでのトランザクションのカスタマイズ方法

トランザクションのカスタマイズ方法として、PDOのエラーモードの設定や、分離レベルの設定などがあります。

○エラーモードの設定

PDOのエラーモードを設定することで、データベース操作でエラーが発生した場合の挙動を制御することができます。

エラーモードはsetAttributeメソッドで設定します。

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

○分離レベルの設定

分離レベルはexecメソッドでSQLコマンドを直接実行することで設定することができます。

$dbh->exec("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");

まとめ

PHPでデータベース操作を行う際のトランザクションの扱い方について詳しく解説しました。

適切なトランザクションの管理は、データの一貫性を保つために非常に重要です。

この記事を参考に、安全なデータ操作を行ってください。