エラー発生時にトランザクションをロールバックする
入社初日に、銀行での送金記録用のトランザクションを設定するタスクが与えられました。
account_id = 1 から $100 を送金し、account_id = 5 に入金する簡単なスクリプトを用意したいと考えています。その後、その入出金を transactions テーブルに登録します。すべて正しく書けたと思いますが、慎重に確認しておきたいですよね。
実はミスがありました。口座 5 の新しいトランザクションを挿入するはずが、存在しない口座 500 に対して挿入してしまっていました。
今後のエラーを防ぐため、作成するスクリプトではエラーが起きた場合にすべての変更をロールバックするようにしてください。問題なく完了した場合は、トランザクションをコミットします。
この演習はコースの一部です
SQL Server におけるトランザクションとエラー処理
演習の手順
- トランザクションを開始します。
- 処理の誤りを修正します。
- エラーがなければトランザクションをコミットします。
CATCHブロック内でトランザクションをロールバックします。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
BEGIN TRY
-- Begin the transaction
BEGIN ___;
UPDATE accounts SET current_balance = current_balance - 100 WHERE account_id = 1;
INSERT INTO transactions VALUES (1, -100, GETDATE());
UPDATE accounts SET current_balance = current_balance + 100 WHERE account_id = 5;
-- Correct it
INSERT INTO transactions VALUES (500, 100, GETDATE());
-- Commit the transaction
___ TRAN;
END TRY
BEGIN CATCH
SELECT 'Rolling back the transaction';
-- Rollback the transaction
___ ___;
END CATCH