構造化照会言語では、TCLはトランザクション制御言語の略語です。データベース内の単一の作業単位は、コマンドの連続実行がトランザクションと呼ばれる後に形成されます。
構造化照会言語にはいくつかのコマンドがあり、トランザクション制御言語コマンドはSQLコマンドの1つです。 TCLコマンドはデータベース内のトランザクションを処理します
構造化照会言語では、コミット、ロールバック、およびセーブポイントは、SQLで広く使用されているトランザクション制御言語コマンドです。
次に、いくつかの例を使用して、トランザクション制御言語コマンドが構造化照会言語でどのように機能するかを理解して学習しましょう。トランザクション制御言語のコマンドは次のとおりです。
- COMMITコマンド
- ROLLBACKコマンド
- SAVEPOINTコマンド
COMMITコマンド
SQLのCommitコマンドは、永続的に変更されるすべてのトランザクションをディスクに保存するために使用されます。 INSERTコマンド、UPDATEコマンド、DELETEコマンドなどのデータ定義言語コマンド(DDL)で操作を実行する場合は常に、これらのコマンドによって行われた変更は永続的ですが、現在のセッションを閉じる前、またはセッションが終了するまでです。セッションがシャットダウンされる前に、データ定義言語を使用して実行した操作を簡単に元に戻すことができます。 Commitコマンドは、セッションを終了せずに変更をストレージに永続的に保存するために使用されます。
構文:
COMMIT;
システムに既存のデータベースがある場合は、その既存のデータベースを使用するか、新しいデータベースを作成します。既存のデータベース会社を使用します。
USE Company
特定のデータを持つ既存の従業員のテーブルについて考えてみます。
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50000 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | ルチカ | JAIN | 50000 | ムンバイ | テスト | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
SQLでは、STARTTRANSACTIONクエリを使用してトランザクションを開始します。
START TRANSACTION;
次に、既存のEmployeesテーブルに2つのレコードを挿入します。複数のレコードを挿入するには、次のステートメントを使用します。
INSERT INTO EMPLOYEES (EMPLOYEEID, FIRST_NAME, LAST_NAME, SALARY, CITY, DEPARTMENT, MANAGERID) VALUES (4002, 'ASHWINI', 'BAGHAT', 54500, 'JAIPUR', 'JAVA', 3), (4003, 'PURVA', 'DHANDEKAR', 57000, 'PUNE', 'TESTING', 4);
次に、SELECTクエリを使用して、レコードがテーブルに正常に挿入されているかどうかを確認します。
SELECT * FROM EMPLOYEES;
上記のクエリの出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50000 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | ルチカ | JAIN | 50000 | ムンバイ | テスト | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
4002 | ASHWINI | バガット | 54500 | ジャイプール | JAVA | 3 |
4003 | PURVA | DHANDEKAR | 57000 | PUNE | テスト | 4 |
出力には、すべてのレコードが正常に挿入されたことが示されます。
INSERT操作をEmployeesテーブルに保存するために、COMMITコマンドを実行します。
COMMIT;
SQLでは、デフォルトで自動コミットがオンになっています。 SQLで自動コミットをオフにするには、自動コミット値を0に設定します。
従業員ID4002を更新し、都市を「ノイダ」に設定します。以下のクエリを使用して、従業員レコードを更新します。
UPDATE EMPLOYEES SET CITY = 'NOIDA' WHERE EMPLOYEEID = 4002;
次に、SELECTクエリを使用して、テーブル内のレコードが正常に更新されたかどうかを確認します。
SELECT * FROM EMPLOYEES;
上記のクエリの出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50000 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | ルチカ | JAIN | 50000 | ムンバイ | テスト | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
4002 | ASHWINI | バガット | 54500 | NOIDA | JAVA | 3 |
4003 | PURVA | DHANDEKAR | 57000 | PUNE | テスト | 4 |
出力からわかるように、従業員ID4002の都市が変更されました。
従業員のテーブルに変更を保存するために、COMMITコマンドを記述します。
COMMIT;
ここで、Employeesテーブルから従業員ID4003を削除します。以下のクエリを使用して、従業員レコードを削除します。
DELETE FROM EMPLOYEES WHERE EMPLOYEEID = 4003;
次に、SELECTクエリを使用して、テーブル内のレコードが正常に削除されたかどうかを確認します。
SELECT * FROM EMPLOYEES;
上記のクエリの出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50000 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | ルチカ | JAIN | 50000 | ムンバイ | テスト | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
4002 | ASHWINI | バガット | 54500 | NOIDA | JAVA | 3 |
出力は、従業員ID4003の詳細を削除したことを確認します。
従業員のテーブルに変更を保存するために、COMMITコマンドを記述します。
COMMIT;
SAVEPOINTコマンド
実行されるデータベース操作は、2つの部分に分けることができます。たとえば、実行したすべてのdeleteステートメントをトランザクションの1つのセグメントと見なし、updateステートメントをトランザクションの1つのセグメントと見なします。同じトランザクションの挿入部分に挿入クエリを保存し、削除部分に削除クエリを保存するには、SQLでSAVEPOINTコマンドを使用します。削除に関連するすべてのクエリを、deleteという名前のセーブポイントで保存するとします。削除に関連するすべての操作を1つのセーブポイントに保存するには、削除クエリを実行した後、SAVEPOINTコマンドを実行してからセーブポイント名を実行する必要があります。
構文:
SAVEPOINT savepoint name;
ROLLBACKコマンド
トランザクションの実行中に、トランザクションのさまざまなセグメントを保存するためのセーブポイントを作成しました。ユーザーの要件が変更されると、ユーザーは別のセーブポイントへのトランザクションを元に戻すことができます。シナリオを考えてみましょう。トランザクションを開始した後、テーブルを作成し、テーブルにレコードを挿入しました。テーブルにレコードを追加した後、savepointという名前のINSを作成しました。挿入後、削除操作を実行しましたが、後で間違ったレコードを誤って削除したことを思い出しました。トランザクションを元に戻して、セーブポイントINSに到達します。トランザクションを元に戻すには、ROLLBACKコマンドを使用します。
実行した操作をロールバックすることも、セーブポイントトランザクション全体をロールバックすることもできます。
操作をロールバックする構文:
ROLLBACK;
トランザクションをロールバックする構文:
ROLLBACK TO savepoint;
SAVEPOINTコマンドとROLLBACKコマンドの例:
システムに既存のデータベースがある場合は、その既存のデータベースを使用するか、新しいデータベースを作成します。 Companyという名前の既存のデータベースを選択します。
USE Company
次のレコードを持つ既存の従業員のテーブルについて考えてみます。
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50000 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | ルチカ | JAIN | 50000 | ムンバイ | テスト | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
4002 | ASHWINI | バガット | 54500 | NOIDA | JAVA | 3 |
SQLでは、STARTTRANSACTIONクエリを使用してトランザクションを開始します。
START TRANSACTION;
次に、既存のEmployeesテーブルに2つのレコードを挿入します。複数のレコードを挿入するには、以下のステートメントを使用します:
INSERT INTO EMPLOYEES (EMPLOYEEID, FIRST_NAME, LAST_NAME, SALARY, CITY, DEPARTMENT, MANAGERID) VALUES (4003, 'PURVA', 'DHANDEKAR', 57000, 'PUNE', 'TESTING', 4), (5001, 'ASHWIN', 'PATEL', 54500, 'JAIPUR', 'JAVA', 3);
次に、SELECTクエリを使用して、レコードがテーブルに正常に挿入されているかどうかを確認します。
SELECT * FROM EMPLOYEES;
上記のクエリの出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50000 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | ルチカ | JAIN | 50000 | ムンバイ | テスト | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
4002 | ASHWINI | バガット | 54500 | NOIDA | JAVA | 3 |
4003 | PURVA | DHANDEKAR | 57000 | PUNE | テスト | 4 |
5001 | ASHWIN | PATEL | 54500 | ジャイプール | JAVA | 3 |
ご存知のとおり、SQLのSAVEPOINTコマンドは、同じトランザクションのさまざまな部分を保存するために使用されます。挿入はトランザクションの1つのセグメントであると想定します。セーブポイントを使用して、この挿入セグメントを挿入として保存します。
SAVEPOINT Insertion;
次に、Employeeテーブルに対してUPDATE操作を実行し、従業員ID2003の従業員の給与を1.2ずつ更新します。
UPDATE EMPLOYEES SET SALARY = SALARY * 1.2 WHERE EMPLOYEEID = 2003;
EmployeesテーブルでSELECTクエリを実行して、更新操作をクロスチェックします。
SELECT * FROM EMPLOYEES WHERE EMPLOYEEID = 2003;
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
2003 | ルチカ | JAIN | 60000 | ムンバイ | テスト | 4 |
上記のクエリ結果は、従業員ID2003レコードが正常に更新されたことを示しています。
更新クエリをトランザクションの1つのセグメントと見なします。更新という名前のSAVEPOINTを使用して、更新操作部分を保存します。
SAVEPOINT Updation;
次に、Employeesテーブルに対して削除操作を実行します。従業員の給与が60000を超える従業員テーブルに対して削除操作を実行します。
DELETE FROM EMPLOYEES WHERE SALARY > 60000;
EmployeesテーブルでSELECTクエリを実行して、削除操作をクロスチェックします。
SELECT * FROM EMPLOYEES;
上記のクエリの出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50000 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2003 | ルチカ | JAIN | 60000 | ムンバイ | テスト | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4002 | ASHWINI | バガット | 54500 | NOIDA | JAVA | 3 |
4003 | PURVA | DHANDEKAR | 57000 | PUNE | テスト | 4 |
5001 | ASHWIN | PATEL | 54500 | ジャイプール | JAVA | 3 |
上記のクエリは、従業員レコードの削除が成功したことを示しています。
削除クエリをトランザクションの1つのセグメントと見なします。 Deletionという名前のSAVEPOINTを使用して、更新操作部分を保存します。
SAVEPOINT Deletion;
突然、ユーザーは、削除操作で実行したいクエリがそのクエリではないことに気づきました。このような状況では、ユーザーはトランザクション全体をSAVEPOINTにロールバックします。ユーザーは、挿入、更新SAVEPOINTなど、ロールバックしたい任意のSAVEPOINTにロールバックできます。
ROLLBACK TO Insertion;
ユーザーがレコードを削除したくない場合。したがって、ユーザーは挿入SAVEPOINTにロールバックされます。
更新および削除操作を実行する前に持っていたのと同じemployeeテーブルがあることをクロスチェックします。従業員の詳細を取得するには、従業員のテーブルでSELECT操作を実行します。
SELECT * FROM EMPLOYEES;
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50000 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | ルチカ | JAIN | 50000 | ムンバイ | テスト | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
4002 | ASHWINI | バガット | 54500 | NOIDA | JAVA | 3 |
4003 | PURVA | DHANDEKAR | 57000 | PUNE | テスト | 4 |
5001 | ASHWIN | PATEL | 54500 | ジャイプール | JAVA | 3 |