SQL Serverのトランザクションの基本:BEGIN TRANSACTION、COMMIT、ROLLBACKの使い方を徹底解説

SQL Serverを使ったデータベース操作では、トランザクションが非常に重要です。トランザクションは、データの整合性を保つために複数の操作をまとめて一つのまとまりとして扱う仕組みです。

本記事では、SQL Serverにおけるトランザクションの基本を解説し、具体的な使い方や注意点について学びます。最後には演習問題も用意しているので、ぜひ実践してみてください。


トランザクションとは?

トランザクションとは、データベースにおける一連の操作をまとめて扱う仕組みのことです。例えば、以下のような操作を考えてみましょう:

  1. 顧客データを更新する
  2. その変更に基づいて売上データを更新する

この2つの操作が両方成功する場合のみ変更を確定し、片方が失敗した場合にはどちらも反映しないようにする必要があります。このような操作を確実に行うためにトランザクションが用いられます。


トランザクションの4つの特性(ACID特性)

トランザクションは以下の4つの特性を持ちます:

  1. Atomicity(原子性)
    全ての操作が完全に成功するか、全て失敗するかのいずれかです。
  2. Consistency(一貫性)
    トランザクションが終了した後もデータの一貫性が保たれます。
  3. Isolation(独立性)
    同時に実行される複数のトランザクションが互いに干渉しないようにします。
  4. Durability(永続性)
    トランザクションが成功すると、その結果が永続的に保存されます。

トランザクション制御の基本構文

SQL Serverでは、トランザクションを制御するために以下の3つのコマンドを使用します:

BEGIN TRANSACTION

トランザクションを開始するためのコマンドです。以下の例では、トランザクションの開始を示しています。

BEGIN TRANSACTION;

COMMIT

トランザクション内の操作を確定し、データベースに保存するためのコマンドです。

COMMIT;

ROLLBACK

トランザクション内で行った操作を取り消し、データベースをトランザクション開始前の状態に戻すためのコマンドです。

ROLLBACK;

実際の使用例

具体的なシナリオを基にして、トランザクションの基本的な使い方を確認しましょう。

シナリオ

顧客情報を更新する場合を考えます。以下の操作を行うと仮定します:

  1. 顧客の残高を引き落とす
  2. 売上データを挿入する

両方の操作が成功した場合のみデータを確定し、片方が失敗した場合にはロールバックします。

サンプルコード

BEGIN TRANSACTION;

-- 顧客の残高を引き落とす
UPDATE Customers
SET Balance = Balance - 1000
WHERE CustomerID = 1;

-- 売上データを挿入する
INSERT INTO Sales (CustomerID, Amount, SaleDate)
VALUES (1, 1000, GETDATE());

-- エラーがない場合は確定する
IF @@ERROR = 0
BEGIN
    COMMIT;
    PRINT 'トランザクションが成功しました。';
END
ELSE
BEGIN
    ROLLBACK;
    PRINT 'トランザクションをロールバックしました。';
END;

注意点

トランザクションのスコープ

トランザクションの範囲を明確にすることが重要です。BEGIN TRANSACTIONを使ったら必ずCOMMITまたはROLLBACKを実行するようにしましょう。

デッドロック

複数のトランザクションが互いにロックを掛け合い、進行できなくなる状態をデッドロックと呼びます。これを防ぐためには、テーブルの操作順序を統一するなどの工夫が必要です。

長時間のトランザクション

トランザクションを長時間実行すると、他のユーザーがデータにアクセスできなくなる場合があります。トランザクションは短く保つことが推奨されます。


演習問題

問題

以下のシナリオに基づいてSQLスクリプトを作成してください。

  1. Productsテーブルから在庫数を引き下げる
  2. Ordersテーブルに新しい注文を挿入する
  3. 両方の操作が成功した場合にデータを確定し、一方が失敗した場合はロールバックする
Productsテーブルのスキーマ
  • ProductID (int, 主キー)
  • Stock (int)
Ordersテーブルのスキーマ
  • OrderID (int, 主キー)
  • ProductID (int)
  • Quantity (int)
  • OrderDate (datetime)

解答例

以下は模範解答です。

BEGIN TRANSACTION;

-- 在庫数を引き下げる
UPDATE Products
SET Stock = Stock - 10
WHERE ProductID = 1;

-- 注文を挿入する
INSERT INTO Orders (ProductID, Quantity, OrderDate)
VALUES (1, 10, GETDATE());

-- エラーがないか確認してトランザクションを確定またはロールバック
IF @@ERROR = 0
BEGIN
    COMMIT;
    PRINT 'トランザクションが成功しました。';
END
ELSE
BEGIN
    ROLLBACK;
    PRINT 'トランザクションをロールバックしました。';
END;

まとめ

本記事では、SQL Serverのトランザクションについて基本的な概念や使い方を解説しました。トランザクションを正しく使うことで、データの整合性や安全性を高めることができます。ACID特性を意識しつつ、実際のシナリオに適応できるスキルを身につけてください。

また、演習問題に取り組むことでさらに理解を深めることができます。今回の内容を踏まえて、他のシナリオにも応用してみましょう!