17. MySQL トランザクションを学ぶ

 MySQL トランザクション

MySQL トランザクションは、主に大量の操作と高度に複雑なデータを処理するために使用されます。例えば、人事管理システムでは、個人を削除する場合、その個人の基本情報だけでなく、メールボックスや記事など、個人に関連する情報も削除する必要があります。このように、これらのデータベース操作ステートメントはトランザクションを構成します!

  • トランザクションは、Innodb データベース エンジンを使用するデータベースまたはテーブルに対してのみ、MySQL でサポートされます。
  • トランザクション処理を使用してデータベースの整合性を維持し、SQL ステートメントのバッチをすべて実行するか、まったく実行しないようにすることができます。
  • トランザクションは、挿入、更新、削除ステートメントを管理するために使用されます

一般的に言えば、トランザクションは 4 つの条件 (ACID) を満たす必要があります: 原子性 ( A tomicityまたは indivisible)、一貫性 ( Consistency )、分離 (分離、独立とも呼ばれる)、耐久性 ( Durability )。

  • 原子性:トランザクション内のすべての操作は、完了または未完了のいずれかであり、途中の特定のリンクで終了しません。トランザクションの実行中にエラーが発生した場合、トランザクションが実行されなかったかのように、トランザクションが開始される前の状態にロールバック (Rollback) されます。

  • 一貫性:トランザクションの開始前と終了後にデータベースの整合性が損なわれることはありません。つまり、書き込まれたデータは、事前に設定されたすべてのルールに完全に準拠する必要があります。これには、データの精度、連結、および後続のデータベースが所定の作業を自発的に完了することができます。

  • 分離:複数の同時トランザクションがそのデータを同時に読み取り、書き込み、および変更できるようにするデータベースの機能. 分離により、複数のトランザクションが同時に実行される場合の相互実行によるデータの不整合を防ぐことができます. トランザクションの分離は、コミットされていない読み取り (コミットされていない読み取り)、コミットされた読み取り (コミットされた読み取り)、反復可能な読み取り (反復可能な読み取り)、シリアライズ可能 (シリアライズ可能) など、さまざまなレベルに分けられます。

  • 永続性:トランザクションが完了した後、データの変更は永続的であり、システムに障害が発生しても失われません。

MySQL コマンド ラインのデフォルト設定では、トランザクションは自動的にコミットされます。つまり、SQL ステートメントが実行された直後に COMMIT 操作が実行されます。したがって、トランザクションを明示的に開くには、コマンド BEGIN または START TRANSACTION を使用するか、コマンド SET AUTOCOMMIT=0 を実行して、現在のセッションの自動コミットの使用を無効にする必要があります。

トランザクション制御ステートメント:

  • BEGIN または START TRANSACTION は明示的にトランザクションを開始します。

  • COMMIT は COMMIT WORK も使用できますが、この 2 つは同等です。COMMIT はトランザクションをコミットし、データベースに加えられたすべての変更を永続的にします。

  • ROLLBACK は ROLLBACK WORK も使用できますが、この 2 つは同等です。ロールバックはユーザーのトランザクションを終了し、進行中のコミットされていないすべての変更を元に戻します。

  • SAVEPOINT 識別子。SAVEPOINT を使用すると、トランザクション内にセーブポイントを作成できます。トランザクション内に複数の SAVEPOINT が存在する可能性があります。

  • RELEASE SAVEPOINT 識別子は、トランザクションのセーブポイントを削除します 指定されたセーブポイントがない場合、ステートメントを実行すると例外がスローされます。

  • ROLLBACK TO 識別子は、トランザクションをポイントまでロールバックします。

  • 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 XXXXXX;
Database changed
mysql> CREATE TABLE xxxxxx_transaction_test( id int(5)) engine=innodb;  # 创建数据表
Query OK, 0 rows affected (0.04 sec)
 
mysql> select * from xxxxxx_transaction_test;
Empty set (0.01 sec)
 
mysql> begin;  # 开始事务
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into xxxxxx_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
 
mysql> insert into xxxxxx_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 xxxxxx_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 xxxxxx_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 xxxxxx_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 = '123456';          // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
    die('连接失败: ' . mysqli_error($conn));
}
// 设置编码,防止中文乱码
mysqli_query($conn, "set names utf8");
mysqli_select_db( $conn, 'XXXXXX' );
mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行
mysqli_begin_transaction($conn);            // 开始事务定义
 
if(!mysqli_query($conn, "insert into xxxxxx_transaction_test (id) values(8)"))
{
    mysqli_query($conn, "ROLLBACK");     // 判断当执行失败时回滚
}
 
if(!mysqli_query($conn, "insert into xxxxxx_transaction_test (id) values(9)"))
{
    mysqli_query($conn, "ROLLBACK");      // 判断执行失败时回滚
}
mysqli_commit($conn);            //执行事务
mysqli_close($conn);
?>

おすすめ

転載: blog.csdn.net/m0_66404702/article/details/127101110