Mysqli-transactions
MySQLi-トランザクション
トランザクションは、データベース操作操作の連続したグループであり、1つの作業単位であるかのように実行されます。 つまり、グループ内の個々の操作が成功しない限り、トランザクションは決して完了しません。 トランザクション内のいずれかの操作が失敗すると、トランザクション全体が失敗します。
実際には、多くのSQLクエリを1つのグループにまとめ、トランザクションの一部としてそれらすべてをまとめて実行します。
トランザクションのプロパティ
トランザクションには、通常、頭字語ACIDで参照される次の4つの標準プロパティがあります-
- Atomicity -ワークユニット内のすべての操作が正常に完了することを保証します。そうでない場合、トランザクションは失敗した時点で中止され、以前の操作は以前の状態にロールバックされます。
- 一貫性-正常にコミットされたトランザクションでデータベースが状態を適切に変更することを保証します。
- 分離-トランザクションが相互に独立して透過的に動作できるようにします。
- 耐久性-システム障害が発生した場合に、コミットされたトランザクションの結果または効果が持続することを保証します。
MySQLでは、トランザクションはステートメントBEGIN WORKで始まり、COMMITまたはROLLBACKステートメントで終了します。 開始ステートメントと終了ステートメントの間のSQLiコマンドは、トランザクションの大部分を形成します。
コミットとロールバック
これらの2つのキーワード Commit および Rollback は、主にMySQLトランザクションに使用されます。
トランザクションが正常に完了したら、COMMITコマンドを発行して、関連するすべてのテーブルへの変更を有効にします。
障害が発生した場合、ROLLBACKコマンドを発行して、トランザクションで参照されているすべてのテーブルを以前の状態に戻す必要があります。
*AUTOCOMMIT* というセッション変数を設定することにより、トランザクションの動作を制御できます。 AUTOCOMMITが1(デフォルト)に設定されている場合、各SQLステートメント(トランザクション内または非トランザクション)は完全なトランザクションと見なされ、終了時にデフォルトでコミットされます。 AUTOCOMMITが0に設定されている場合、SET AUTOCOMMIT = 0コマンドを発行すると、後続の一連のステートメントはトランザクションのように動作し、明示的なCOMMITステートメントが発行されるまでアクティビティはコミットされません。
mysqli_query()*関数を使用して、これらのSQLコマンドをPHPで実行できます。
トランザクションの一般的な例
この一連のイベントは、使用されるプログラミング言語に依存しません。論理パスは、アプリケーションの作成に使用する言語で作成できます。
- mysqli_query()*関数を使用して、これらのSQLコマンドをPHPで実行できます。
- SQLコマンド* BEGIN WORK。*を発行してトランザクションを開始します
- SELECT、INSERT、UPDATE、DELETEなどの1つ以上のSQLコマンドを発行します。
- エラーがなく、すべてが要件に従っているかどうかを確認します。
- エラーがある場合はROLLBACKコマンドを発行し、そうでない場合はCOMMITコマンドを発行します。
MySQLiのトランザクションセーフテーブルタイプ
トランザクションを直接使用することはできませんが、使用できますが、安全で保証されません。 MySQLiプログラミングでトランザクションを使用する場合は、特別な方法でテーブルを作成する必要があります。 トランザクションをサポートするテーブルには多くの種類がありますが、最も一般的なものは InnoDB です。
InnoDBテーブルのサポートには、ソースからMySQLiをコンパイルするときに特定のコンパイルパラメーターが必要です。 MySQLiバージョンにInnoDBのサポートがない場合は、インターネットサービスプロバイダーにInnoDBテーブルタイプをサポートするバージョンのMySQLiを構築するか、WindowsまたはLinux/UNIX用のMySQL-Maxバイナリディストリビューションをダウンロードしてインストールし、開発環境。
MySQLiインストールがInnoDBテーブルをサポートしている場合は、 TYPE = InnoDB 定義をテーブル作成ステートメントに追加するだけです。 たとえば、次のコードは、tutorials_innodbというInnoDBテーブルを作成します-
root@host# mysql -u root -p;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tutorials_innodb
-> (
-> tutorial_author varchar(40) NOT NULL,
-> tutorial_count INT
-> ) TYPE = InnoDB;
Query OK, 0 rows affected (0.02 sec)
次のリンクで詳細を確認してください-https://dev.mysql.com/doc/refman/5.7/en/innodb-parametersl[InnoDB]
*GEMINI* や *BDB* などの他のタイプのテーブルを使用できますが、これら2つのタイプをサポートするかどうかはインストールに依存します。