MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでネストされたトランザクションを扱う方法:SAVEPOINTの使い方を解説

MySQLでは、SAVEPOINTステートメントを使用することで、擬似的に「ネストされたトランザクション」のような処理を実現できます。MySQLは厳密な意味でのネストされたトランザクションを直接サポートしていませんが、セーブポイントを活用することで、トランザクション内の特定の時点まで部分的にロールバックすることが可能になります。

SAVEPOINTによるネストされたトランザクションの基本手順

全体の流れは以下のとおりです。

  1. テーブルを作成する
  2. トランザクションを開始する
  3. テーブルにレコードを挿入する
  4. SAVEPOINTステートメントで名前付きのセーブポイントを設定する
  5. ROLLBACK TOで特定のセーブポイントまで巻き戻す

それでは、実際のクエリを使って各ステップを詳しく見ていきましょう。

ステップ1:テーブルを作成する

mysql> create table NestedTransactionDemo
   -> (
   -> Name varchar(200)
   -> );
Query OK, 0 rows affected (0.63 sec)

ステップ2:トランザクションを開始する

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

ステップ3:テーブルにレコードを挿入する

まず、最初のレコードを追加します。

mysql> insert into NestedTransactionDemo values('John');
Query OK, 1 row affected (0.04 sec)

挿入されたデータを確認してみましょう。

mysql> select *from NestedTransactionDemo;
+------+
| Name |
+------+
| John |
+------+
1 row in set (0.00 sec)

ステップ4:セーブポイントを作成してネストされたトランザクションのように扱う

ここからが本題です。savepoint transaction2;でセーブポイントを設定し、その後に別のレコードを挿入してみます。

mysql> savepoint transaction2;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into NestedTransactionDemo values('David');
Query OK, 1 row affected (0.00 sec)

mysql> select *from NestedTransactionDemo;
+-------+
| Name  |
+-------+
| John  |
| David |
+-------+
2 rows in set (0.00 sec)

この時点で、テーブルには「John」と「David」の2件が存在しています。

ステップ5:ROLLBACK TOでセーブポイントまで巻き戻す

ROLLBACK TO transaction2;を実行すると、セーブポイント設定以降に行った変更(この場合は「David」の挿入)だけが取り消されます。

mysql> rollback to transaction2;
Query OK, 0 rows affected (0.00 sec)

mysql> select *from NestedTransactionDemo;
+------+
| Name |
+------+
| John |
+------+
1 row in set (0.00 sec)

ご覧のとおり、「David」の行だけが削除され、「John」の行はそのまま残っています。これにより、トランザクション全体を取り消すことなく、途中の変更のみを選択的に元に戻せるのです。

まとめ

  • MySQLは真のネストされたトランザクションをサポートしていないが、SAVEPOINTを使えば同等の動作を実現できる
  • SAVEPOINT 名前;で任意の時点にセーブポイントを設定できる
  • ROLLBACK TO 名前;でそのセーブポイント以降の変更のみを取り消せる
  • セーブポイントが不要になったらRELEASE SAVEPOINT 名前;で解放でき、トランザクション全体を確定したい場合はCOMMITを実行する

このようにSAVEPOINTを活用することで、複雑なデータ操作の中でも細かなエラー復旧や段階的な制御が可能になり、より安全で柔軟なトランザクション設計を行えます。

  1. MySQLで@記号を使う方法!ユーザー定義変数の基本と実例をわかりやすく解説

    MySQLで@記号を使用するには、SETコマンドを利用します。@記号は、セッション内で有効なユーザー定義変数を設定する際に使われる記号です。変数に値を格納しておけば、後続のクエリ内でその値を何度でも再利用できるため、条件の共通化や一時的な値の保持に非常に便利です。 @記号によるユーザー定義変数の基本構文 ユーザー定義変数を設定する基本的な構文は以下のとおりです。 SET @anyVariableName := yourValue; :=は代入演算子で、右側の値を左側の変数に代入します。これにより、以降のSQL文の中で@anyVariableNameを参照できるようになります。 サンプルテーブル

  2. C#でネストされたif文(入れ子構造)を使う方法をわかりやすく解説

    C#におけるネストされたif文(入れ子のifステートメント)とは、あるif文またはelse if文の中に、さらに別のif文やelse if文を組み込んで記述する構造のことです。外側の条件が満たされた場合にのみ、内側の条件が評価されるため、複数の条件を段階的にチェックしたい場面で非常に役立ちます。ネストされたif文の基本構文ネストされたif文の基本的な書き方は以下のとおりです。if( boolean_expression 1) {     /* ブール式1がtrueの場合に実行される */     if(boolea