PDOPHP拡張機能を使用してUbuntu18.04のPHPでMySQLトランザクションを実行する方法
著者は、 Write for DOnations プログラムの一環として、 Open Sourcing MentalIllnessを選択して寄付を受け取りました。
序章
MySQL トランザクションは、データベース内で単一のユニットとして実行される、論理的に関連するSQLコマンドのグループです。 トランザクションは、アプリケーションで ACID(Atomicity、Consistency、Isolation、およびDurability)コンプライアンスを適用するために使用されます。 これは、データベースでの処理操作の信頼性を管理する一連の標準です。
Atomicityは、関連するトランザクションの成功、またはエラーが発生した場合の完全な失敗を保証します。 一貫性は、定義されたビジネスロジックに従ってデータベースに送信されたデータの有効性を保証します。 分離とは、データベースに接続しているさまざまなクライアントの影響が相互に影響を与えないようにする、同時トランザクションの正しい実行です。 耐久性により、論理的に関連するトランザクションがデータベースに永続的に残ります。
トランザクションを介して発行されたSQLステートメントは、成功するか、完全に失敗する必要があります。 クエリのいずれかが失敗した場合、MySQLは変更をロールバックし、データベースにコミットされることはありません。
MySQLトランザクションがどのように機能するかを理解する良い例は、eコマースWebサイトです。 顧客が注文すると、アプリケーションは、ビジネスロジックに応じて、orders
やorders_products
などのいくつかのテーブルにレコードを挿入します。 単一の注文に関連するマルチテーブルレコードは、単一の論理ユニットとしてデータベースにアトミックに送信する必要があります。
もう1つのユースケースは、銀行のアプリケーションです。 クライアントが送金しているとき、いくつかのトランザクションがデータベースに送信されます。 送信者のアカウントから借方に記入され、受信者のパーティアカウントに貸方記入されます。 2つのトランザクションは同時にコミットする必要があります。 それらの1つに障害が発生した場合、データベースは元の状態に戻り、変更をディスクに保存する必要はありません。
このチュートリアルでは、 PDO PHP拡張機能を使用します。これは、PHPでデータベースを操作するためのインターフェイスを提供し、Ubuntu18.04サーバーでMySQLトランザクションを実行します。
前提条件
始める前に、次のものが必要になります。
- Ubuntu 18.04を使用した初期サーバーセットアップに従ってセットアップされた1つのUbuntu18.04サーバー(sudo非rootユーザーを含む)。
- システムにインストールされているApache、MySQL、およびPHP。 Linux、Apache、MySQL、PHP(LAMP)スタックをUbuntu18.04にインストールする方法に関するガイドに従うことができます。 手順4(仮想ホストの設定)をスキップして、デフォルトのApache設定で直接作業することができます。
ステップ1—サンプルデータベースとテーブルの作成
MySQLトランザクションの操作を開始する前に、まずサンプルデータベースを作成し、いくつかのテーブルを追加します。 まず、rootとしてMySQLサーバーにログインします。
- sudo mysql -u root -p
プロンプトが表示されたら、MySQLルートパスワードを入力し、ENTER
を押して続行します。 次に、データベースを作成します。このチュートリアルでは、データベースをsample_store
と呼びます。
- CREATE DATABASE sample_store;
次の出力が表示されます。
OutputQuery OK, 1 row affected (0.00 sec)
データベース用にsample_user
というユーザーを作成します。 PASSWORD
を強力な値に置き換えることを忘れないでください。
- CREATE USER 'sample_user'@'localhost' IDENTIFIED BY 'PASSWORD';
sample_store
データベースに対してユーザーの完全な特権を発行します。
- GRANT ALL PRIVILEGES ON sample_store.* TO 'sample_user'@'localhost';
最後に、MySQL権限をリロードします。
- FLUSH PRIVILEGES;
ユーザーを作成すると、次の出力が表示されます。
OutputQuery OK, 0 rows affected (0.01 sec)
. . .
データベースとユーザーを配置すると、MySQLトランザクションがどのように機能するかを示すためのいくつかのテーブルを作成できるようになります。
MySQLサーバーからログアウトします。
- QUIT;
システムがログアウトすると、次の出力が表示されます。
OutputBye.
次に、作成したsample_user
の資格情報を使用してログインします。
- sudo mysql -u sample_user -p
sample_user
のパスワードを入力し、ENTER
を押して続行します。
sample_store
に切り替えて、現在選択されているデータベースにします。
- USE sample_store;
選択すると、次の出力が表示されます。
OutputDatabase Changed.
次に、products
テーブルを作成します。
- CREATE TABLE products (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE) ENGINE = InnoDB;
このコマンドは、product_id
という名前のフィールドを持つproducts
テーブルを作成します。 最大2^63-1の大きな値に対応できるBIGINT
データ型を使用します。 PRIMARY KEY
と同じフィールドを使用して、製品を一意に識別します。 AUTO_INCREMENT
キーワードは、新製品が挿入されるときに次の数値を生成するようにMySQLに指示します。
product_name
フィールドのタイプはVARCHAR
で、最大50
の文字または数字を保持できます。 製品price
の場合、DOUBLE
データ型を使用して、10進数の価格の浮動小数点形式に対応します。
最後に、 InnoDBをENGINE
として使用します。これは、MyISAM
などの他のストレージエンジンとは対照的に、MySQLトランザクションを快適にサポートするためです。
products
テーブルを作成すると、次の出力が得られます。
OutputQuery OK, 0 rows affected (0.02 sec)
次に、次のコマンドを実行して、products
テーブルにいくつかのアイテムを追加します。
- INSERT INTO products(product_name, price) VALUES ('WINTER COAT','25.50');
- INSERT INTO products(product_name, price) VALUES ('EMBROIDERED SHIRT','13.90');
- INSERT INTO products(product_name, price) VALUES ('FASHION SHOES','45.30');
- INSERT INTO products(product_name, price) VALUES ('PROXIMA TROUSER','39.95');
INSERT
の各操作の後に、次のような出力が表示されます。
OutputQuery OK, 1 row affected (0.02 sec)
. . .
次に、データが製品テーブルに追加されたことを確認します。
- SELECT * FROM products;
挿入した4つの製品のリストが表示されます。
Output+------------+-------------------+-------+
| product_id | product_name | price |
+------------+-------------------+-------+
| 1 | WINTER COAT | 25.5 |
| 2 | EMBROIDERED SHIRT | 13.9 |
| 3 | FASHION SHOES | 45.3 |
| 4 | PROXIMA TROUSER | 39.95 |
+------------+-------------------+-------+
4 rows in set (0.01 sec)
次に、顧客に関する基本情報を保持するためのcustomers
テーブルを作成します。
- CREATE TABLE customers (customer_id BIGINT PRIMARY KEY AUTO_INCREMENT, customer_name VARCHAR(50) ) ENGINE = InnoDB;
products
テーブルと同様に、customer_id
にはBIGINT
データ型を使用します。これにより、テーブルが2^63-1レコードまでの多くの顧客をサポートできるようになります。 。 キーワードAUTO_INCREMENT
は、新しい顧客を挿入すると、列の値をインクリメントします。
customer_name
列は英数字値を受け入れるため、[X104X]