PHPとMySQLのトランザクション処理について解説します。
- トランザクション処理とは何なのか?
- トランザクション処理の書き方が分からない。
この記事では、上記の疑問を解決します。
トランザクション処理とは?
トランザクション処理とは、MySQLのテーブルにデータを保存などをする際に、他のユーザーからのアクセスを出来ないようにテーブルをロックする仕組みです。
トランザクション処理を書くことにより、同時にアクセスをした際に処理が完了するまで他のユーザーはデータを上書きすることは出来ません。
データの更新時に成功したらデータを更新して、失敗したらデータを元に戻しデータが壊れないようにします。
トランザクション処理はデータを守るために重要な役割を持っていますので必須の処理と言えます。
PDOトランザクションの書き方
トランザクションでは以下の3つのメソッドを使用します。
- beginTransaction() トランザクションの開始
- commit() 更新を確定
- rollBack() 失敗時に更新をキャンセル
トランザクションの書き方は以下の通り。
<?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の後にbeginTransaction、executeの後に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つ!
- beginTransaction() トランザクションの開始
- commit() 更新を確定
- rollBack() 失敗時に更新をキャンセル
トランザクション処理はデータベースを扱う上で必須となるので覚えておきましょう。。