COMMITは変更を確定し、ROLLBACKは未確定の変更を取り消します。COMMIT済みの変更を後からROLLBACKで元に戻すことはできません。以下の開始構文とエラー処理の例はSQL Serverを対象とし、既存の検証用テーブルがあることを前提にします。
SQLのCOMMITは、データベースにおけるトランザクション管理の中心的な役割を果たします。データベース操作において、トランザクション内の一連の変更を確定させるためにはCOMMITコマンドが不可欠です。この記事では、SQLのCOMMITコマンドの基本的な使い方とその効果について詳しく解説し、データベース管理における重要性を理解する手助けをします。
トランザクションとは
トランザクションとは、データベース管理システムにおける一連の操作のことを指します。これらの操作は、すべてが成功するか、すべてが失敗するかのいずれかで実行されるべき一体化した単位として扱われます。トランザクションの主な目的は、データの整合性と一貫性を保つことです。
ACID特性
トランザクションはACID特性を持つことで信頼性を高めます。ACIDは以下の4つの特性を表します。
- Atomicity(原子性): トランザクション内の全操作が成功するか、全操作が失敗するかを保証します。
- Consistency(一貫性): トランザクションが終了したときに、データベースの状態が一貫性を保つことを保証します。
- Isolation(分離性): 複数のトランザクションが同時に実行される場合でも、互いに干渉しないようにします。
- Durability(耐久性): トランザクションが成功した後の変更は、永続的に保存されます。
COMMITの基本的な使い方
COMMITは、現在のトランザクションで行われたすべての変更を確定し、データベースに反映させるためのSQLコマンドです。これにより、他のユーザーからも変更が見えるようになります。以下は基本的なCOMMITの構文です。
基本構文
COMMIT;COMMITコマンドは、特定のトランザクションの終了を意味し、そのトランザクション内で行われたすべての操作を永続的に保存します。
使用例
次の例は、データベースに新しいレコードを挿入し、その変更をCOMMITするシナリオを示します。
BEGIN TRANSACTION;
INSERT INTO employees (name, position, salary)
VALUES ('John Doe', 'Software Engineer', 75000);
COMMIT;この例では、まずトランザクションを開始し、新しい従業員の情報を挿入し、最後にCOMMITコマンドを実行して変更を確定します。
COMMITの効果
COMMITコマンドを実行すると、トランザクション内で行われたすべての変更がデータベースに確定され、他のユーザーからも見えるようになります。具体的には以下のような効果があります。
変更の永続化
COMMITを実行すると、そのトランザクション内で行われたすべての変更はデータベースに永続的に保存されます。耐久性はDB製品やログ・ストレージ設定にも依存します。COMMITはバックアップの代わりではなく、誤った変更も確定してしまうため、確定前の確認が必要です。
データの整合性の確保
トランザクションの途中でエラーが発生した場合、ROLLBACKコマンドを使用して変更を取り消すことができますが、COMMITそのものが業務上の正しさを判定するわけではありません。対象行数、制約、残高や在庫などの業務条件を満たすことを確認した場合に確定します。
ロックの解放
トランザクションが進行中の間、データベースはそのトランザクションが操作しているリソースにロックをかけることがあります。COMMITを実行することで、これらのロックが解除され、他のトランザクションが同じリソースにアクセスできるようになります。
他のユーザーへの変更の公開
確定後の変更が他のトランザクションからいつ見えるかは、分離レベルや読み取り時点にも依存します。すでに開始したスナップショット読み取りに直ちに反映されるとは限りません。
COMMITとROLLBACKの違い
COMMITとROLLBACKは、どちらもトランザクションの終了を示すSQLコマンドですが、その効果は対照的です。以下では、それぞれのコマンドの違いと用途について説明します。
COMMITの用途
COMMITは、トランザクション内で行われたすべての変更を確定し、データベースに反映させるために使用されます。これにより、他のユーザーがその変更を見られるようになります。
COMMITの特徴
- 変更の永続化
- データの整合性の確保
- ロックの解放
- 他のユーザーへの変更の公開
ROLLBACKの用途
ROLLBACKは、トランザクション内で行われたすべての変更を取り消し、データベースをトランザクション開始前の状態に戻すために使用されます。これは、エラーが発生した場合や変更を確定したくない場合に有効です。
ROLLBACKの特徴
- 変更の取り消し
- データの一貫性の回復
- ロックの解放
- エラー処理の一環としての使用
比較例:確定と取り消しは別々に試す
次は取り消しを確認する例です。ROLLBACKの後にCOMMITを続けても、取り消した変更を再び確定することはできません。確定を試す場合は、別の検証で最後のROLLBACKをCOMMITへ置き換えます。
BEGIN TRANSACTION;
INSERT INTO employees (name, position, salary)
VALUES ('Jane Doe', 'Project Manager', 85000);
ROLLBACK;
COMMITを使用するタイミング
必要な操作がすべて完了し、期待した行数・値・業務条件を確認してから確定します。SQL Serverの@@ERRORは直前の文についての値であり、最後のUPDATE後に0だったからといって、その前のINSERTも成功したとはいえません。複数文の例ではTRY/CATCHで失敗経路を分けます。
SQL Serverで成功時だけCOMMITする例
次はSQL Server用の説明例です。既存トランザクションの外で実行すること、dbo.Inventoryのproduct_idが一意でstockがNULL不可の整数であることを前提とします。実スキーマへ合わせ、検証用DBで確認してください。本記事では実DB上の実行検証はしていません。
SET XACT_ABORT ON;
DECLARE @product_id int = 1;
DECLARE @quantity int = 2;
IF @quantity IS NULL OR @quantity <= 0
BEGIN
THROW 50001, N'数量は正の整数を指定してください。', 1;
END;
BEGIN TRY
BEGIN TRANSACTION;
UPDATE dbo.Inventory
SET stock = stock - @quantity
WHERE product_id = @product_id
AND stock >= @quantity;
IF @@ROWCOUNT <> 1
BEGIN
THROW 50002, N'商品が存在しないか、在庫が不足しています。', 1;
END;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
ROLLBACK TRANSACTION;
END;
THROW;
END CATCH;
UPDATEと在庫数の条件を同じ文にし、その直後に変更行数を確認します。0行なら商品不存在または在庫不足としてエラーにし、成功時のみCOMMITします。CATCHでは残っているトランザクションを取り消し、THROWで呼出元へエラーを返します。
この例はすべてのエラーや運用条件を網羅するものではありません。既存トランザクション内からの呼び出し、接続切断、デッドロック再試行などは別途設計します。自動再試行で同じ注文や在庫減算が二重実行されないようにしてください。
注文処理やデータ移行へ適用するとき
注文ヘッダーと明細を登録する場合は、実際に作成された注文IDを製品に適した方法で取得し、明細へ渡します。新しい注文IDが常に1になるとは限りません。複数の登録・更新を同じTRY内、COMMIT前へ置き、制約と件数を確認します。
大量移行では、長時間のロック、ログ容量、失敗時の復旧時間も考慮します。分割コミットは負荷を減らせる場合がありますが、全件を一括で取り消す性質を変えるため、途中状態を許すかを先に決めます。
自動コミットと製品差に注意
接続やツールが自動コミットの場合、文ごとに確定することがあります。BEGIN/START TRANSACTIONやDDLの暗黙コミット、トランザクション対応範囲はDB製品によって異なります。SQL Server用のTRY/CATCHをMySQLやPostgreSQLへそのまま貼り付けないでください。
まとめ
この記事では、SQLのCOMMITコマンドの基本的な使い方とその効果について解説しました。COMMITは、トランザクション内の変更を確定し、データベースに永続的に保存するために不可欠なコマンドです。トランザクションの概念とACID特性、COMMITとROLLBACKの違い、COMMITを使用するタイミング、そして実際の応用例を通じて、COMMITの重要性と実践的な利用方法を理解できたことでしょう。データベース操作における信頼性と一貫性を確保するために、適切なタイミングでCOMMITを使用することが求められます。


コメント