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

MySQLストアドプロシージャ内でCOMMITによるトランザクション制御を行う方法

MySQLでは、START TRANSACTIONステートメントでトランザクションを開始し、開始後に行われた変更内容を確定(永続化)するためにCOMMITを使用します。この2つはストアドプロシージャの中でも問題なく組み合わせて利用できます。

本記事では、ストアドプロシージャ内でSTART TRANSACTIONとCOMMITを使い、テーブルへの新規レコード挿入と更新をまとめてコミットする具体例を紹介します。

準備:対象となるテーブルのデータ

以下の例では、「employee.tbl」というテーブルに対して操作を行います。事前のデータは次の通りです。

mysql> Select * from employee.tbl;
+----+---------+
| Id | Name    |
+----+---------+
|  1 | Mohan   |
|  2 | Gaurav  |
|  3 | Rahul   |
|  4 | Saurabh |
+----+---------+
4 rows in set (0.00 sec)

例:COMMITを含むストアドプロシージャの作成

次のように、START TRANSACTIONでトランザクションを開始し、INSERT文とUPDATE文を実行した後にCOMMITで変更を確定するストアドプロシージャを作成します。

mysql> Delimiter //
mysql> Create Procedure st_transaction_commit()
    -> BEGIN
    -> START TRANSACTION;
    -> INSERT INTO employee.tbl(name) values ('Yash');
    -> UPDATE employee.tbl set name = 'Sohan' WHERE id = 3;
    -> COMMIT;
    -> END //
Query OK, 0 rows affected (0.03 sec)

ポイント解説

  • Delimiter //:ストアドプロシージャ作成時は、デフォルトの区切り文字を一時的に変更して、BEGIN〜END内のセミコロンがそのまま処理されるようにしています。
  • START TRANSACTION:ここから後続のSQL文の変更がトランザクション管理下に入ります。
  • COMMIT:トランザクション開始以降のすべての変更を確定し、他のセッションからも参照できる状態にします。

プロシージャの実行結果の確認

区切り文字をもとに戻し、CALL文でこのプロシージャを呼び出すと、INSERTとUPDATEが実行され、その変更が自動的にコミットされます。

mysql> Delimiter ;
mysql> Call st_transaction_commit();
Query OK, 0 rows affected (0.17 sec)

mysql> Select * from employee.tbl;
+----+---------+
| Id | Name    |
+----+---------+
|  1 | Mohan   |
|  2 | Gaurav  |
|  3 | Sohan   |
|  4 | Saurabh |
|  5 | Yash    |
+----+---------+
5 rows in set (0.00 sec)

実行結果の読み方

  • ID 5として「Yash」という新しいレコードが挿入されています。
  • ID 3の名前が「Rahul」から「Sohan」へ更新されています。

このように、ストアドプロシージャ内でSTART TRANSACTIONとCOMMITを組み合わせることで、複数のDML文(INSERT・UPDATE・DELETEなど)をひとつの単位としてまとめて確定させることができ、データ整合性を保ちながら安全なデータベース操作が実現できます。

  1. MySQLのストアドプロシージャ内でSTART TRANSACTIONを実行する方法

    MySQLでは、START TRANSACTIONを実行すると新しいトランザクションが開始され、自動コミット(auto-commit)モードがオフに設定されます。これにより、明示的にCOMMITまたはROLLBACKを実行するまで、データの変更内容は確定されません。以下の例では、START TRANSACTIONを含むストアドプロシージャを作成し、employee.tblテーブルに新しいレコードを挿入します。まず、対象となるテーブルには現在、次のデータが格納されています。mysql> Select * from employee.tbl; +----+---------+ | Id |

  2. MySQLストアドプロシージャ内で別のストアドプロシージャを呼び出す方法

    MySQLのストアドプロシージャは、その内部で別のストアドプロシージャを呼び出すことが可能です。これはCALLステートメントを使用することで実現でき、処理をモジュール化して再利用性を高める上で非常に便利な機能です。ここでは、あるストアドプロシージャが別のストアドプロシージャを呼び出し、last_insert_id()を取得する具体例を見ていきましょう。サンプルテーブルの作成まず、例として使用するテーブルを作成します。以下のテーブルは、自動採番されるIDと名前を持つ従業員テーブルです。mysql> CREATE TABLE employee.tbl(Id INT NOT NULL AUTO