著者は、 Write for DOnations プログラムの一環として、 Open Sourcing MentalIllnessを選択して寄付を受け取りました。

序章

MySQL トランザクションは、データベース内で単一のユニットとして実行される、論理的に関連するSQLコマンドのグループです。 トランザクションは、アプリケーションで ACID(Atomicity、Consistency、Isolation、およびDurability)コンプライアンスを適用するために使用されます。 これは、データベースでの処理操作の信頼性を管理する一連の標準です。

Atomicityは、関連するトランザクションの成功、またはエラーが発生した場合の完全な失敗を保証します。 一貫性は、定義されたビジネスロジックに従ってデータベースに送信されたデータの有効性を保証します。 分離とは、データベースに接続しているさまざまなクライアントの影響が相互に影響を与えないようにする、同時トランザクションの正しい実行です。 耐久性により、論理的に関連するトランザクションがデータベースに永続的に残ります。

トランザクションを介して発行されたSQLステートメントは、成功するか、完全に失敗する必要があります。 クエリのいずれかが失敗した場合、MySQLは変更をロールバックし、データベースにコミットされることはありません。

MySQLトランザクションがどのように機能するかを理解する良い例は、eコマースWebサイトです。 顧客が注文すると、アプリケーションは、ビジネスロジックに応じて、ordersorders_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サーバーにログインします。

  1. sudo mysql -u root -p

プロンプトが表示されたら、MySQLルートパスワードを入力し、ENTERを押して続行します。 次に、データベースを作成します。このチュートリアルでは、データベースをsample_storeと呼びます。

  1. CREATE DATABASE sample_store;

次の出力が表示されます。

Output
Query OK, 1 row affected (0.00 sec)

データベース用にsample_userというユーザーを作成します。 PASSWORDを強力な値に置き換えることを忘れないでください。

  1. CREATE USER 'sample_user'@'localhost' IDENTIFIED BY 'PASSWORD';

sample_storeデータベースに対してユーザーの完全な特権を発行します。

  1. GRANT ALL PRIVILEGES ON sample_store.* TO 'sample_user'@'localhost';

最後に、MySQL権限をリロードします。

  1. FLUSH PRIVILEGES;

ユーザーを作成すると、次の出力が表示されます。

Output
Query OK, 0 rows affected (0.01 sec) . . .

データベースとユーザーを配置すると、MySQLトランザクションがどのように機能するかを示すためのいくつかのテーブルを作成できるようになります。

MySQLサーバーからログアウトします。

  1. QUIT;

システムがログアウトすると、次の出力が表示されます。

Output
Bye.

次に、作成したsample_userの資格情報を使用してログインします。

  1. sudo mysql -u sample_user -p

sample_userのパスワードを入力し、ENTERを押して続行します。

sample_storeに切り替えて、現在選択されているデータベースにします。

  1. USE sample_store;

選択すると、次の出力が表示されます。

Output
Database Changed.

次に、productsテーブルを作成します。

  1. 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進数の価格の浮動小数点形式に対応します。

最後に、 InnoDBENGINEとして使用します。これは、MyISAMなどの他のストレージエンジンとは対照的に、MySQLトランザクションを快適にサポートするためです。

productsテーブルを作成すると、次の出力が得られます。

Output
Query OK, 0 rows affected (0.02 sec)

次に、次のコマンドを実行して、productsテーブルにいくつかのアイテムを追加します。

  1. INSERT INTO products(product_name, price) VALUES ('WINTER COAT','25.50');
  2. INSERT INTO products(product_name, price) VALUES ('EMBROIDERED SHIRT','13.90');
  3. INSERT INTO products(product_name, price) VALUES ('FASHION SHOES','45.30');
  4. INSERT INTO products(product_name, price) VALUES ('PROXIMA TROUSER','39.95');

INSERTの各操作の後に、次のような出力が表示されます。

Output
Query OK, 1 row affected (0.02 sec) . . .

次に、データが製品テーブルに追加されたことを確認します。

  1. 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テーブルを作成します。

  1. 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]