MySQLトランザクション
MySQL トランザクション
MySQL トランザクションは、主に大規模な操作と高度に複雑なデータを処理するために使用されます。例えば、人事管理システムにおいて、個人を削除する場合、その個人の基本情報を削除するとともに、その個人に関連するメールボックスや記事などの情報も削除する必要があります。このようにして、これらのデータベースは、操作ステートメントはトランザクションを構成します。
MySQL では、Innodb データベース エンジンを使用するデータベースまたはテーブルのみがトランザクションをサポートします。
トランザクション処理を使用すると、データベースの整合性を維持し、SQL ステートメントのバッチがすべて実行されるか、まったく実行されないかを確認できます。
トランザクションは、挿入、更新、削除ステートメントを管理するために使用されます
一般的に言えば、トランザクションは、原子性 (または不可分性)、一貫性)、分離 (独立性とも呼ばれます)、および耐久性の 4 つの条件 (ACID) を満たす必要があります。 (耐久性)。
原子性: トランザクション内のすべての操作は完了するか完了しないかのどちらかであり、中間段階で終了することはありません。トランザクションの実行中にエラーが発生した場合は、トランザクションがまったく実行されなかったかのように、トランザクションが開始される前の状態にロールバックされます。
一貫性: トランザクションの開始前と終了後にデータベースの整合性が損なわれることはありません。これは、書き込まれるデータが、データの精度や連結など、事前に設定されたすべてのルールに完全に準拠する必要があり、後続のデータベースが所定の作業を自発的に完了できることを意味します。
分離: データベースでは、複数の同時トランザクションが同時にデータの読み取り、書き込み、変更を行うことができ、複数のトランザクションが同時に実行される場合のクロス実行によるデータの不整合を防ぐことができます。トランザクション分離は、非コミット読み取り、コミット読み取り、反復読み取り、シリアル化可能など、さまざまなレベルに分かれています。
永続性: トランザクションの完了後、データへの変更は永続的であり、システムに障害が発生した場合でも失われることはありません。
注: MySQL コマンドラインのデフォルト設定では、トランザクションは自動的にコミットされます。つまり、COMMIT 操作は SQL ステートメントの実行直後に実行されます。したがって、トランザクションを明示的に開始するには、コマンド BEGIN または START TRANSACTION を使用するか、コマンド SET AUTOCOMMIT=0 を実行して現在のセッションの自動コミットの使用を無効にする必要があります。
トランザクション制御ステートメント:
BEGIN または START TRANSACTION;
COMMIT を使用することもできますが、これらは同等です。 COMMIT はトランザクションをコミットし、データベースへのすべての変更を永続的にします。
- ROLLBACK; ROLLBACK WORK を使用できますが、この 2 つは同等です。ロールバックはユーザーのトランザクションを終了し、進行中のコミットされていない変更をすべて元に戻します。
SAVEPOINT 識別子。トランザクション内にセーブポイントを作成できます。
RELEASE SAVEPOINT 識別子が指定されていない場合は、トランザクションのセーブポイントを削除します。ポイントを保存し、トランザクションの分離レベルを設定するために使用される
SET TRANSACTION ステートメントは例外をスローします。 InnoDB ストレージ エンジンによって提供されるトランザクション分離レベルは、READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、および SERIALIZABLE です。
- MYSQL には 2 つの主なトランザクション処理方法があります:
1. BEGIN、ROLLBACK、COMMIT を使用して
BEGIN を実装してトランザクションを開始します
ROLLBACKトランザクションのロールバック
-
COMMIT トランザクションの確認
- 2. SET を直接使用して MySQL の自動コミット モードを変更します:
SET AUTOCOMMIT=0 自動コミットを無効にする
SET AUTOCOMMIT=1 自動コミットをオンにする
-
mysql> use DEMO; Database changed mysql> CREATE TABLE demo_transaction_test( id int(5)) engine=innodb; # 创建数据表 Query OK, 0 rows affected (0.04 sec) mysql> select * from demo_transaction_test;Empty set (0.01 sec) mysql> begin; # 开始事务Query OK, 0 rows affected (0.00 sec) mysql> insert into demo_transaction_test value(5);Query OK, 1 rows affected (0.01 sec) mysql> insert into demo_transaction_test value(6);Query OK, 1 rows affected (0.00 sec) mysql> commit; # 提交事务 Query OK, 0 rows affected (0.01 sec) mysql> select * from demo_transaction_test; +------+ | id | +------+ | 5 | | 6 | +------+2 rows in set (0.01 sec) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into demo_transaction_test values(7); Query OK, 1 rows affected (0.00 sec) mysql> rollback; # 回滚 Query OK, 0 rows affected (0.00 sec) mysql> select * from demo_transaction_test; # 因为回滚所以数据没有插入+------+ | id | +------+ | 5 | | 6 | +------+2 rows in set (0.01 sec) mysql>
PHP でのトランザクション インスタンスの使用
MySQL ORDER BY テスト:
<?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = 'root'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ){ die('连接失败: ' . mysqli_error($conn));} // 设置编码,防止中文乱码 mysqli_query($conn, "set names utf8"); mysqli_select_db( $conn, 'DEMO' ); mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行 mysqli_begin_transaction($conn); // 开始事务定义 if(!mysqli_query($conn, "insert into demo_transaction_test (id) values(8)")) { mysqli_query($conn, "ROLLBACK");// 判断当执行失败时回滚} if(!mysqli_query($conn, "insert into demo_transaction_test (id) values(9)")){ mysqli_query($conn, "ROLLBACK");// 判断执行失败时回滚 } mysqli_commit($conn); //执行事务 mysqli_close($conn); ?>
関連ビデオチュートリアルの推奨事項:
トランザクション構文