SQL Server トランザクション:TRY...CATCH ステートメントによるエラー処理とロールバック
SQL Server トランザクション エラー時のロールバック
SQL Server では、トランザクションと呼ばれる機能により、複数の操作をひとつのまとまりとして実行できます。トランザクション内で実行された操作は、すべて成功するか、すべて失敗して元に戻されます。
エラー時のロールバック
トランザクション内でエラーが発生すると、自動的にロールバックが行われます。ロールバックにより、トランザクション開始時点の状態に戻ります。
ロールバックの仕組み
SQL Server は、トランザクション開始時に トランザクションログと呼ばれるファイルに、すべての操作を記録します。エラーが発生した場合、トランザクションログを使用して、トランザクション開始時点の状態にデータベースを復元します。
以下の例では、UPDATE
ステートメントでエラーが発生するため、トランザクション全体がロールバックされます。
BEGIN TRANSACTION;
UPDATE テーブル SET 列 = 値 WHERE 条件;
-- エラーが発生
COMMIT TRANSACTION;
コミットとロールバック
トランザクションは、COMMIT
ステートメントによって手動でコミットすることもできます。コミットすると、トランザクション内の変更がデータベースに永続的に保存されます。
ROLLBACK
ステートメントを使用すると、トランザクションを手動でロールバックできます。
注意事項
- すべてのエラーがロールバックされるわけではありません。構文エラーなど、一部のエラーはロールバックされません。
- ロールバックは、トランザクション開始時点の状態にデータベースを復元します。そのため、トランザクション中に他のユーザーによってデータが変更されていた場合、その変更は失われます。
関連キーワード
- SQL
- SQL Server
- トランザクション
- コミット
BEGIN TRANSACTION;
-- テーブルにデータを追加
INSERT INTO テーブル (列1, 列2) VALUES ('値1', '値2');
-- エラーが発生するUPDATEステートメント
UPDATE テーブル SET 列3 = '値3' WHERE 条件;
-- エラーが発生するため、ここには到達しない
COMMIT TRANSACTION;
-- エラーが発生したため、ロールバックされる
ROLLBACK TRANSACTION;
このコードを実行すると、INSERT
ステートメントによってテーブルにデータが追加されますが、UPDATE
ステートメントでエラーが発生するため、トランザクション全体がロールバックされ、データ追加は取り消されます。
TRY...CATCH
ステートメントを使用して、エラー処理とロールバックを記述するサンプルコード- 複数のトランザクションをネストさせるサンプルコード
これらのサンプルコードは、インターネット上や書籍などで入手できます。
- TRY...CATCH
トランザクションエラー時のロールバック方法
SQL Server トランザクションエラー時のロールバックには、以下の方法があります。
- TRY...CATCH ステートメント
BEGIN TRANSACTION;
-- 処理
ROLLBACK TRANSACTION;
BEGIN TRY
-- 処理
END TRY
BEGIN CATCH
-- エラー処理
ROLLBACK TRANSACTION;
END CATCH
- トランザクションログを使用して、手動でデータベースを復元する。
- 第三者製のツールを使用して、ロールバックを行う。
sql sql-server sql-server-2005