PHP+MySQLのトランザクション処理の使い方

PHP+MySQL トランザクション プログラミング

PHPとMySQLのトランザクション処理について解説します。

  • トランザクション処理とは何なのか?
  • トランザクション処理の書き方が分からない。

この記事では、上記の疑問を解決します。

トランザクション処理とは?

トランザクション処理とは、MySQLのテーブルにデータを保存などをする際に、他のユーザーからのアクセスを出来ないようにテーブルをロックする仕組みです。

トランザクション処理を書くことにより、同時にアクセスをした際に処理が完了するまで他のユーザーはデータを上書きすることは出来ません。

データの更新時に成功したらデータを更新して、失敗したらデータを元に戻しデータが壊れないようにします。

トランザクション処理はデータを守るために重要な役割を持っていますので必須の処理と言えます。

PDOトランザクションの書き方

トランザクションでは以下の3つのメソッドを使用します。

トランザクションの書き方は以下の通り。

<?php

$pdo = new PDO(DSN, USERNAME, PASSWORD);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  
$stmt = $pdo->prepare("SQL文");

//トランザクションの開始
$pdo->beginTransaction();
try {
  $stmt->bindParam(処理);
  $stmt->execute();

  //更新を確定
  $stmt->pdo->commit();
} catch(PDOException $e) {
  //更新のキャンセル
  $this->pdo->rollback();
  throw $e;
}
?>

簡単に説明すると例外処理のtry-catchを使いprepareの後にbeginTransactionexecuteの後にcommit、catchの後にrollBackといった感じです。

 トランザクション処理の例

おーむがPHPでToDoリストを作成した際のトランザクション処理の例です。(※一部を抜粋)

<?php 
define('DSN', 'mysql:host=localhost;dbname=todo_app');
define('DB_USERNAME', 'omu');
define('DB_PASSWORD', 'omu');
?>

<?php

class Todo {
  public $pdo;

  public function __construct() {
    try {
      $this->pdo = new PDO(DSN, DB_USERNAME, DB_PASSWORD);
      $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
      echo $e->getMessage();
      exit;
    }
  }

  public function getAll() {
    $stmt = $this->pdo->query("select * from todos order by id desc");
    return $stmt->fetchAll(PDO::FETCH_OBJ);
  }

  public function regist($data) {
    $stmt = $this->pdo->prepare("
    insert into todos (title, status, deadline, created_at)
    values (:title, :status, :deadline, now())
    ");
    $this->pdo->beginTransaction();
    try {
      $stmt->bindParam(':title', $data['title'], PDO::PARAM_STR);
      $stmt->bindParam(':status', $data['defaultStatus'], PDO::PARAM_INT);
      $stmt->bindParam(':deadline', $data['deadline'], PDO::PARAM_STR);
      $stmt->execute();
      $this->pdo->commit();
    } catch(PDOException $e) {
      $this->pdo->rollback();
      throw $e;
    }
  }
}

まとめ

トランザクション処理で使うメソッドは以下の3つ!

トランザクション処理はデータベースを扱う上で必須となるので覚えておきましょう。。