MySQLでネストされたトランザクションを実現する方法:SAVEPOINTの使い方を解説
MySQLでは、厳密な意味での「ネストされたトランザクション」はサポートされていませんが、START TRANSACTIONコマンドとSAVEPOINTを組み合わせることで、複数のトランザクションが存在するかのように扱うことができます。セーブポイントを設定すれば、トランザクション全体を取り消すことなく、特定の時点まで処理をロールバックできます。
ここでは、実際にテーブルを作成し、セーブポイントを使ったロールバックの手順を順番に見ていきましょう。
1. テーブルの作成
まず、CREATEコマンドを使ってサンプル用のテーブルを作成します。
mysql> CREATE table transactionDemo -> ( -> id int auto_increment, -> primary key(id) -> ); Query OK, 0 rows affected (0.76 sec)
idカラムは自動採番(AUTO_INCREMENT)にしているため、値を指定せずにレコードを挿入できるシンプルな構成です。
2. トランザクションの開始と最初のINSERT
次に、START TRANSACTIONコマンドでトランザクションを開始します。
mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec)
続いて、INSERTコマンドで最初のレコードを挿入します。
mysql> INSERT into transactionDemo values(); Query OK, 1 row affected (0.04 sec)
SELECT文でデータを確認してみましょう。
mysql> SELECT * from transactionDemo;
実行結果は以下の通りです。
+----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
3. SAVEPOINTでセーブポイントを設定
この時点の状態を保存するために、SAVEPOINTコマンドでセーブポイント「t2」を設定します。
mysql> SAVEPOINT t2;
これにより、以降の変更だけを取り消せる「巻き戻し地点」が作られました。
4. 2つ目のレコードを挿入
セーブポイント設定後にもう1件、レコードを挿入します。
mysql> INSERT into transactionDemo values(); Query OK, 1 row affected (0.00 sec)
SELECTコマンドですべてのレコードを表示すると、次のようになります。
mysql> SELECT *from transactionDemo;
実行結果:
+----+ | id | +----+ | 1 | | 2 | +----+ 2 rows in set (0.00 sec)
5. セーブポイントまでロールバック
ここで、ROLLBACK TOコマンドを使って、セーブポイント「t2」まで処理を巻き戻します。これにより、セーブポイント設定後に行われた挿入のみが取り消されます。
mysql> ROLLBACK TO t2; Query OK, 0 rows affected (0.03 sec)
再度テーブルの中身を確認してみましょう。
mysql> SELECT * from transactionDemo;
実行結果:
+----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
まとめ
このように、START TRANSACTIONでトランザクションを開始し、途中にSAVEPOINTを設定しておけば、ROLLBACK TO セーブポイント名によってその地点まで処理を部分的に取り消すことができます。MySQLは真のネストされたトランザクションを直接サポートしていませんが、セーブポイントを活用することで、事実上それに近い制御が可能になります。エラー発生時に一部の処理だけを無効化したい場合など、実務でも非常に役立つテクニックなので、ぜひ覚えておきましょう。
-
MySQLのDECIMAL型(10進数)の使い方を徹底解説!正確な数値を保存する方法
MySQLのDECIMAL型は、金額など誤差が許されない「正確な数値」を格納するためのデータ型です。FLOAT型やDOUBLE型は浮動小数点数として近似値を扱うため丸め誤差が発生しますが、DECIMAL型は文字列と同様の仕組みで数値を保持するため、正確な値をそのまま保存できます。DECIMAL型の基本構文DECIMAL型は以下のように、全体の桁数(M)と小数点以下の桁数(D)を指定して定義します。yourColumnName DECIMAL(M, D);M(精度): 小数点を含む全体の最大桁数(1〜65)D(スケール): 小数点以下の桁数(0〜30)例えば DECIMAL(6,2) の場合、「
-
MySQLでネストされたトランザクションを扱う方法:SAVEPOINTの使い方を解説
MySQLでは、SAVEPOINTステートメントを使用することで、擬似的に「ネストされたトランザクション」のような処理を実現できます。MySQLは厳密な意味でのネストされたトランザクションを直接サポートしていませんが、セーブポイントを活用することで、トランザクション内の特定の時点まで部分的にロールバックすることが可能になります。 SAVEPOINTによるネストされたトランザクションの基本手順 全体の流れは以下のとおりです。 テーブルを作成する トランザクションを開始する テーブルにレコードを挿入する SAVEPOINTステートメントで名前付きのセーブポイントを設定する ROLLBACK