記事ディレクトリ
MySQL データベーストランザクション ロールバック分離/オープン コンセプト/レベル処理 php ステートメント
MySQL 事務
MySQL トランザクションは、主に大量の操作と高度に複雑なデータを処理するために使用されます。例えば、人事管理システムでは、人物を削除する場合、その人物の基本情報と、メールボックスや記事など、その人物に関連する情報の両方を削除する必要があります。取引を構成します!
- トランザクションは、Innodb データベース エンジンを使用するデータベースまたはテーブルに対してのみ、MySQL でサポートされます。
- トランザクション処理を使用してデータベースの整合性を維持し、SQL ステートメントのバッチをすべて実行するか、まったく実行しないようにすることができます。
- トランザクションは、挿入、更新、削除ステートメントを管理するために使用されます
一般的に、トランザクションは4つの条件(ACID)を満たす必要があります: Atomicity (原子性)、Consistency (安定性)、Isolation (分離)、Durability (信頼性)。
- 1、トランザクションの原子性:成功または撤回するトランザクションのセット。
- 2、安定:不正なデータ (外部キー制約など) があり、トランザクションが取り消されます。
- 3、隔離:トランザクションは独立して実行されます。トランザクションの結果が他のトランザクションに影響を与える場合、他のトランザクションは取り消されます。速度を犠牲にしてトランザクションを 100% 分離します。
- 4、信頼性:ソフトウェアとハードウェアがクラッシュした後、InnoDB データ テーブル ドライバーはログ ファイルを使用して再構築および変更します。信頼性と高速性を両立させることはできません。innodb_flush_log_at_trx_commit オプションは、いつトランザクションをログに保存するかを決定します。
MySQL コマンド ラインのデフォルト設定では、トランザクションは自動的にコミットされます。つまり、SQL ステートメントが実行された直後に COMMIT 操作が実行されます。したがって、トランザクションを明示的に開くには、コマンド BEGIN または START TRANSACTION を使用するか、コマンド SET AUTOCOMMIT=0 を実行して、現在のセッションの自動コミットの使用を無効にする必要があります。
トランザクション制御ステートメント:
- BEGIN または START TRANSACTION; 明示的にトランザクションを開始します。
- COMMIT; COMMIT WORK も使用できますが、この XNUMX つは同等です。 COMMIT はトランザクションをコミットし、データベースに加えられたすべての変更を永続的にします。
- ROLLBACK; ROLLBACK WORK を使用することは可能ですが、この XNUMX つは同等です。ロールバックはユーザーのトランザクションを終了し、進行中のコミットされていないすべての変更を元に戻します。
- SAVEPOINT 識別子; SAVEPOINT を使用すると、トランザクション内にセーブポイントを作成でき、トランザクション内に複数の SAVEPOINT が存在する可能性があります。
- RELEASE SAVEPOINT 識別子; トランザクションのセーブポイントを削除します。指定されたセーブポイントがない場合、ステートメントを実行すると例外がスローされます。
- ROLLBACK TO 識別子; トランザクションをポイントまでロールバックします。
- SET TRANSACTION; トランザクションの分離レベルを設定するために使用されます。 InnoDB ストレージ エンジンによって提供されるトランザクション分離レベルは、READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、および SERIALIZABLE です。
MYSQL トランザクション処理には、主に XNUMX つの方法があります。
1. BEGIN、ROLLBACK、COMMIT を使用して達成する
- ベギン 取引を開始する
- ロールバック トランザクションのロールバック
- コミット 取引確認
2. SET を直接使用して、MySQL の自動コミット モードを変更します。
- オートコミットを設定=0 自動コミットを無効にする
- オートコミットを設定=1 自動コミットをオンにする
取引テスト
mysql> use chenweiliang; Database changed mysql> CREATE TABLE chenweiliang_transaction_test( id int(5)) engine=innodb; # 创建数据表 Query OK, 0 rows affected (0.04 sec) mysql> select * from chenweiliang_transaction_test; Empty set (0.01 sec) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into chenweiliang_transaction_test value(5); Query OK, 1 rows affected (0.01 sec) mysql> insert into chenweiliang_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 chenweiliang_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 chenweiliang_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 chenweiliang_transaction_test; # 因为回滚所以数据没有插入 +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql>
PHP でのトランザクション インスタンスの使用
MySQL ORDER BY テスト:
<? php $dbhost = 'localhost:3306'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn, "set names utf8"); mysqli_select_db( $conn, 'chenweiliang' ); mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行 mysqli_begin_transaction($conn); // 开始事务定义 if(!mysqli_query($conn, "insert into chenweiliang_transaction_test (id) values(8)")) { mysqli_query($conn, "ROLLBACK"); // 判断当执行失败时回滚 } if(!mysqli_query($conn, "insert into chenweiliang_transaction_test (id) values(9)")) { mysqli_query($conn, "ROLLBACK"); // 判断执行失败时回滚 } mysqli_commit($conn); //执行事务 mysqli_close($conn); ?>
Hope Chen Weiliang ブログ ( https://www.chenweiliang.com/ ) は、「MySQL データベース トランザクション ロールバックの分離/オープン コンセプト/PHP ステートメントのレベル処理」を共有しました。
この記事のリンクを共有することを歓迎します。https://www.chenweiliang.com/cwl-494.html
Chen WeiliangのブログのTelegramチャンネルへようこそ。最新のアップデートを入手できます!
📚 このガイドには非常に価値のある内容が含まれています。🌟これはめったにない機会です、お見逃しなく! ⏰⌛💨
気に入ったらシェア&いいね!
あなたの共有といいねは、私たちの継続的な動機です!