【 PHP 】PHP8に入門してみた 197日目 PHPの基本 ( データベース トランザクション )

PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。

データベース

トランザクション

トランザクションとは、複数のデータベース操作を一連の処理として扱い、全体が完了するか失敗するかのいずれかになるまで、
中途半端な状態になることなく一括して処理を行う仕組みです。

トランザクションには、以下のような特徴があります。

  1. ACID特性
    トランザクションは、ACID(Atomicity, Consistency, Isolation, Durability)の特性を持っています。
    それぞれ以下のような意味を持ちます。
  • Atomicity(原子性):トランザクションを構成する操作は、全て実行されるか全く実行されないかのどちらかである
  • Consistency(一貫性):トランザクションを実行する前と後で、データベースの整合性が維持される
  • Isolation(独立性):トランザクションは、他のトランザクションと独立して実行される
  • Durability(永続性):トランザクションが完了した時点で、その結果は永続的に保存される
  1. ロールバック
    トランザクションが失敗した場合、途中までの処理を全て取り消して、トランザクション開始前の状態に戻すことができます。
    この処理をロールバックと呼びます。
  2. コミット
    トランザクションが完了した場合、その処理を確定して、データベースに反映することができます。
    この処理をコミットと呼びます。

トランザクションは、一連の処理をまとめて扱えます。
例えば複数のテーブルにまたがるデータの更新など、複雑な処理を安全に実行することができます。
また、トランザクションを使うことで、データの整合性を保ちながら複数のユーザーが同時にデータベースにアクセスすることができます。

トランザクションの例です。

現在のテーブルのデータ


+-------------------+----------------------------------------------------------+-------+--------------------+------------+
| isbn              | title                                                    | price | publish            | published  |
+-------------------+----------------------------------------------------------+-------+--------------------+------------+
| 978-4-7741-6566-0 | PHPライブラリ&サンプル実践活用                             |  2480 | 技術評論社         | 2020-06-24 |
| 978-4-7741-7078-7 | サーブレット&JSPポケットリファレンス                        |  2680 | 技術評論社         | 2021-01-08 |
| 978-4-7741-7568-3 | Angularアプリケーションプログラミング                       |  3700 | 技術評論社         | 2021-08-19 |
| 978-4-7980-4179-7 | ASP.NET MVC実践プログラミング                              |  3500 | 秀和システム       | 2020-09-20 |
| 978-4-7980-4512-2 | はじめてのASP.NET Webフォームアプリ開発                     |  3000 | 秀和システム       | 2021-11-13 |
| 978-4-7981-3546-5 | JavaScript逆引きレシピ                                    |  3000 | 翔泳社             | 2020-08-28 |
| 978-4-7981-4034-6 | 10日でおぼえるJSP&サーブレット入門教室                     |  2800 | 翔泳社             | 2021-03-16 |
| 978-4-7981-4102-2 | プログラマのためのDocker教科書・・(^^)/                     |  5000 | 翔泳社             | 2021-11-19 |
| 978-4-7981-6849-4 | 独習PHP 第4版                                             |  3740 | 翔泳社             | 2021-06-14 |
| 978-4-8222-9644-5 | アプリを作ろう! Android入門                               |  2000 | 日経BP社           | 2021-08-21 |
+-------------------+----------------------------------------------------------+-------+--------------------+------------+

trainsaction.php

<?php
require_once './DbManager.php';

try {
    // データベースへの接続
    $db = getDb();

    // 例外有効化
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // トランザクション開始
    $db->beginTransaction();

    $insert_query = "INSERT INTO book(isbn, title, price, publish, published)";
    $db->exec("{$insert_query} VALUES('978-4-7981-2151-2', '独習PHP 第X版', 3200,'翔泳社','2021-04-12')");

    // 主キー(978-4-7981-2151-2)が重複するのでエラーになります。
    $db->exec("{$insert_query} VALUES('978-4-7981-2151-2', 'ひとりで学ぶPHP', 3500,'翔泳社', '2021-06-01')");

    $db->commit();
} catch (PDOException $e) {
    // ロールバック
    $db->rollBack();
    die("エラーメッセージ: {$e->getMessage()}");
}

実行後のテーブルのデータ

データは全く変化ありません!


+-------------------+----------------------------------------------------------+-------+--------------------+------------+
| isbn              | title                                                    | price | publish            | published  |
+-------------------+----------------------------------------------------------+-------+--------------------+------------+
| 978-4-7741-6566-0 | PHPライブラリ&サンプル実践活用                            |  2480 | 技術評論社         | 2020-06-24 |
| 978-4-7741-7078-7 | サーブレット&JSPポケットリファレンス                       |  2680 | 技術評論社         | 2021-01-08 |
| 978-4-7741-7568-3 | Angularアプリケーションプログラミング                      |  3700 | 技術評論社         | 2021-08-19 |
| 978-4-7980-4179-7 | ASP.NET MVC実践プログラミング                             |  3500 | 秀和システム       | 2020-09-20 |
| 978-4-7980-4512-2 | はじめてのASP.NET Webフォームアプリ開発                    |  3000 | 秀和システム       | 2021-11-13 |
| 978-4-7981-3546-5 | JavaScript逆引きレシピ                                   |  3000 | 翔泳社             | 2020-08-28 |
| 978-4-7981-4034-6 | 10日でおぼえるJSP&サーブレット入門教室                    |  2800 | 翔泳社             | 2021-03-16 |
| 978-4-7981-4102-2 | プログラマのためのDocker教科書・・(^^)/                    |  5000 | 翔泳社             | 2021-11-19 |
| 978-4-7981-6849-4 | 独習PHP 第4版                                            |  3740 | 翔泳社             | 2021-06-14 |
| 978-4-8222-9644-5 | アプリを作ろう! Android入門                               |  2000 | 日経BP社           | 2021-08-21 |
+-------------------+----------------------------------------------------------+-------+--------------------+------------+

 

 

メモ

PHPにおける変数のスコープの概念はどうなっているのか・・・。

PHPPHP

Posted by raika@blog