SQL Serverでトランザクション境界を定義する方法:GO、BEGIN...END、SAVE TRANSACTION、TRY...CATCH
SQL ServerにおけるGOとBEGIN...ENDの違い
GO
- 単一のバッチを表す
- トランザクション境界を定義しない
- エラーが発生しても後続のバッチは実行される
- 主にSSMSなどのツールでスクリプトを実行する際に使用される
例:
-- バッチ1
SELECT * FROM Customers;
GO
-- バッチ2
UPDATE Customers SET LastName = 'Smith' WHERE CustomerID = 1;
GO
BEGIN...END
- 一連のTransact-SQLステートメントをグループ化する
- ブロック内のエラーが発生すると、ブロック全体がロールバックされる
- 主にストアドプロシージャやトリガーなどのモジュール化されたコードで使用される
BEGIN
-- ステートメント1
-- ステートメント2
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION;
RETURN;
END
-- ステートメント3
-- ステートメント4
END
機能 | GO | BEGIN...END |
---|---|---|
バッチ | 単一のバッチを表す | 複数バッチをグループ化 |
トランザクション | トランザクション境界を定義しない | トランザクション境界を定義 |
エラー処理 | エラーが発生しても後続のバッチは実行 | エラーが発生するとブロック全体がロールバック |
使用例 | SSMSなどでスクリプトを実行 | ストアドプロシージャ、トリガーなど |
- 単一のバッチを実行したい場合はGOを使用します。
- 複数のTransact-SQLステートメントをグループ化し、トランザクションとして実行したい場合はBEGIN...ENDを使用します。
-- バッチ1
SELECT * FROM Customers;
GO
-- バッチ2
UPDATE Customers SET LastName = 'Smith' WHERE CustomerID = 1;
GO
BEGIN
-- ステートメント1
-- ステートメント2
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION;
RETURN;
END
-- ステートメント3
-- ステートメント4
END
- ストアドプロシージャ
CREATE PROCEDURE dbo.usp_GetCustomers
AS
BEGIN
SELECT * FROM Customers;
END
- トリガー
CREATE TRIGGER dbo.tr_Customer_Update
ON dbo.Customers
AFTER UPDATE
AS
BEGIN
-- トリガー処理
END
注意:
- 上記のサンプルコードはあくまでも例です。実際のコードは要件に応じて変更する必要があります。
- BEGIN...ENDを使用する場合は、トランザクション処理に関する知識が必要となります。
SQL Serverでトランザクション境界を定義する他の方法
SAVE TRANSACTIONとROLLBACK TRANSACTION/COMMIT TRANSACTION
-- トランザクション開始
SAVE TRANSACTION MyTransaction;
-- ステートメント1
-- ステートメント2
-- エラーが発生した場合
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION MyTransaction;
RETURN;
END
-- ステートメント3
-- ステートメント4
-- トランザクションコミット
COMMIT TRANSACTION MyTransaction;
SET XACT_ABORT ON
-- トランザクション開始
SET XACT_ABORT ON;
-- ステートメント1
-- ステートメント2
-- エラーが発生するとトランザクションは自動的にロールバックされる
-- ステートメント3
-- ステートメント4
TRY...CATCH
BEGIN TRY
-- ステートメント1
-- ステートメント2
END TRY
BEGIN CATCH
-- エラー処理
END CATCH
- BEGIN...ENDは最も一般的な方法です。
- SET XACT_ABORT ONは、エラーが発生したときにトランザクションを自動的にロールバックしたい場合に使用されます。
- TRY...CATCHは、エラー処理をより柔軟に記述したい場合に使用されます。
sql-server