T-SQL-トランザクション
A transactionデータベースに対して実行される作業単位です。トランザクションは、ユーザーが手動で行う場合でも、ある種のデータベースプログラムによって自動的に行う場合でも、論理的な順序で実行される作業の単位またはシーケンスです。
トランザクションとは、データベースへの1つ以上の変更の伝播です。たとえば、レコードを作成したり、レコードを更新したり、テーブルからレコードを削除したりする場合は、テーブルでトランザクションを実行しています。データの整合性を確保し、データベースエラーを処理するには、トランザクションを制御することが重要です。
実際には、多くのSQLクエリをグループにまとめ、トランザクションの一部としてそれらすべてを一緒に実行します。
トランザクションのプロパティ
トランザクションには次の4つの標準プロパティがあり、通常は頭字語ACID-と呼ばれます。
Atomicity−ワークユニット内のすべての操作が正常に完了したことを確認します。それ以外の場合、トランザクションは失敗した時点で中止され、以前の操作は以前の状態にロールバックされます。
Consistency −トランザクションが正常にコミットされると、データベースの状態が適切に変更されるようにします。
Isolation −トランザクションが互いに独立して透過的に動作できるようにします。
Durability −システム障害が発生した場合でも、コミットされたトランザクションの結果または効果が持続することを保証します。
トランザクション制御
トランザクションを制御するために使用される次のコマンドがあります-
COMMIT −変更を保存します。
ROLLBACK −変更をロールバックします。
SAVEPOINT −ロールバックするトランザクションのグループ内にポイントを作成します。
SET TRANSACTION −トランザクションに名前を付けます。
トランザクション制御コマンドは、DMLコマンドのINSERT、UPDATE、およびDELETEでのみ使用されます。これらの操作はデータベースで自動的にコミットされるため、テーブルの作成中または削除中には使用できません。
MS SQL Serverでトランザクション制御コマンドを使用するには、「begin tran」でトランザクションを開始するか、トランザクションコマンドを開始する必要があります。そうしないと、これらのコマンドは機能しません。
COMMITコマンド
COMMITコマンドは、トランザクションによって呼び出された変更をデータベースに保存するために使用されるトランザクションコマンドです。このコマンドは、最後のCOMMITまたはROLLBACKコマンド以降のすべてのトランザクションをデータベースに保存します。
構文
以下は、COMMITコマンドの構文です。
COMMIT;
例
次のレコードを持つCUSTOMERSテーブルについて考えてみます。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
次のコマンド例では、age = 25のテーブルからレコードを削除してから、データベース内の変更をコミットします。
Begin Tran
DELETE FROM CUSTOMERS
WHERE AGE = 25
COMMIT
その結果、テーブルから2つの行が削除され、SELECTステートメントは次の出力を生成します。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
3 kaushik 23 Kota 2000.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
ROLLBACKコマンド
ROLLBACKコマンドは、データベースにまだ保存されていないトランザクションを元に戻すために使用されるトランザクションコマンドです。このコマンドは、最後のCOMMITまたはROLLBACKコマンドが発行されてからのトランザクションを元に戻すためにのみ使用できます。
構文
以下は、ROLLBACKコマンドの構文です。
ROLLBACK
例
次のレコードを持つCUSTOMERSテーブルについて考えてみます。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
次のコマンド例では、age = 25のテーブルからレコードを削除してから、データベース内の変更をロールバックします。
Begin Tran
DELETE FROM CUSTOMERS
WHERE AGE = 25;
ROLLBACK
その結果、削除操作はテーブルに影響を与えず、SELECTステートメントは次の結果を生成します。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
SAVEPOINTコマンド
SAVEPOINTは、トランザクション全体をロールバックせずにトランザクションを特定のポイントにロールバックできるトランザクション内のポイントです。
構文
以下は、SAVEPOINTコマンドの構文です。
SAVE TRANSACTION SAVEPOINT_NAME
このコマンドは、トランザクションステートメント間のSAVEPOINTの作成でのみ機能します。ROLLBACKコマンドは、トランザクションのグループを元に戻すために使用されます。
以下は、SAVEPOINTにロールバックするための構文です。
ROLLBACK TO SAVEPOINT_NAME
次の例では、CUSTOMERSテーブルから3つの異なるレコードを削除します。削除するたびにSAVEPOINTを作成する必要があります。これにより、いつでも任意のSAVEPOINTにロールバックして、適切なデータを元の状態に戻すことができます。
例
次のレコードを持つCUSTOMERSテーブルについて考えてみます-
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
以下は一連の操作です-
Begin Tran
SAVE Transaction SP1
Savepoint created.
DELETE FROM CUSTOMERS WHERE ID = 1
1 row deleted.
SAVE Transaction SP2
Savepoint created.
DELETE FROM CUSTOMERS WHERE ID = 2
1 row deleted.
SAVE Transaction SP3
Savepoint created.
DELETE FROM CUSTOMERS WHERE ID = 3
1 row deleted.
3つの削除が行われましたが、考えを変えて、SP2として識別したSAVEPOINTにロールバックすることにしました。SP2は最初の削除後に作成されたため、最後の2つの削除は取り消されます-
ROLLBACK Transaction SP2
Rollback complete.
SP2にロールバックしてから、最初の削除のみが行われたことに注意してください。
SELECT * FROM CUSTOMERS
6行が選択されました。
ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
SETTRANSACTIONコマンド
SET TRANSACTIONコマンドを使用して、データベーストランザクションを開始できます。このコマンドは、後続のトランザクションの特性を指定するために使用されます。
構文
以下は、SETTRANSACTIONの構文です。
SET TRANSACTION ISOLATION LEVEL <Isolationlevel_name>