Hsqldb-transactions
HSQLDB-トランザクション
- トランザクション*は、データベース操作操作の順次グループであり、実行され、1つの作業単位と見なされます。 つまり、すべての操作が正常に実行されると、トランザクション全体が完了します。 トランザクション内のいずれかの操作が失敗すると、トランザクション全体が失敗します。
トランザクションのプロパティ
基本的に、トランザクションは4つの標準プロパティをサポートします。 それらはACIDプロパティと呼ばれます。
*Atomicity* -トランザクション内のすべての操作が正常に実行されます。そうでない場合、トランザクションは失敗した時点で中止され、以前の操作は以前の位置にロールバックされます。
一貫性-データベースは、正常にコミットされたトランザクションの状態を適切に変更します。
分離-トランザクションが互いに独立して動作し、相互に透過的になるようにします。
耐久性-コミットされたトランザクションの結果または効果は、システム障害の場合に持続します。
コミット、ロールバック、およびセーブポイント
これらのキーワードは、主にHSQLDBトランザクションに使用されます。
コミット-COMMITコマンドを実行して、常に成功したトランザクションを完了する必要があります。
ロールバック-トランザクションで障害が発生した場合、ROLLBACKコマンドを実行して、トランザクションで参照されているすべてのテーブルを以前の状態に戻す必要があります。
*Savepoint* -ロールバックするトランザクションのグループ内にポイントを作成します。
例
次の例では、トランザクションの概念を、コミット、ロールバック、およびセーブポイントとともに説明します。 id、name、age、address、salaryの列を持つテーブルCustomersを考えてみましょう。
Id | Name | Age | Address | Salary |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Karun | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitanya | 25 | Mumbai | 6500.00 |
5 | Harish | 27 | Bhopal | 8500.00 |
6 | Kamesh | 22 | MP | 1500.00 |
7 | Murali | 24 | Indore | 10000.00 |
次のコマンドを使用して、上記のデータの行に沿って顧客テーブルを作成します。
CREATE TABLE Customer (id INT NOT NULL, name VARCHAR(100) NOT NULL, age INT NOT
NULL, address VARCHAR(20), Salary INT, PRIMARY KEY (id));
Insert into Customer values (1, "Ramesh", 32, "Ahmedabad", 2000);
Insert into Customer values (2, "Karun", 25, "Delhi", 1500);
Insert into Customer values (3, "Kaushik", 23, "Kota", 2000);
Insert into Customer values (4, "Chaitanya", 25, "Mumbai", 6500);
Insert into Customer values (5, "Harish", 27, "Bhopal", 8500);
Insert into Customer values (6, "Kamesh", 22, "MP", 1500);
Insert into Customer values (7, "Murali", 24, "Indore", 10000);
COMMITの例
次のクエリは、年齢= 25のテーブルから行を削除し、COMMITコマンドを使用してこれらの変更をデータベースに適用します。
DELETE FROM CUSTOMERS WHERE AGE = 25;
COMMIT;
上記のクエリを実行すると、次の出力が表示されます。
2 rows effected
上記のコマンドが正常に実行されたら、以下のコマンドを実行して顧客テーブルのレコードを確認します。
Select *from Customer;
上記のクエリを実行すると、次の出力が表示されます。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000 |
| 3 | kaushik | 23 | Kota | 2000 |
| 5 | Harish | 27 | Bhopal | 8500 |
| 6 | Kamesh | 22 | MP | 4500 |
| 7 | Murali | 24 | Indore | 10000 |
+----+----------+-----+-----------+----------+
ロールバックの例
入力と同じCustomerテーブルを考えてみましょう。
Id | Name | Age | Address | Salary |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Karun | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitanya | 25 | Mumbai | 6500.00 |
5 | Harish | 27 | Bhopal | 8500.00 |
6 | Kamesh | 22 | MP | 1500.00 |
7 | Murali | 24 | Indore | 10000.00 |
以下に、年齢= 25のテーブルからレコードを削除し、データベースの変更をROLLBACKすることにより、ロールバック機能について説明するクエリの例を示します。
DELETE FROM CUSTOMERS WHERE AGE = 25;
ROLLBACK;
上記の2つのクエリが正常に実行された後、次のコマンドを使用してCustomerテーブルのレコードデータを表示できます。
Select* from Customer;
上記のコマンドを実行すると、次の出力が表示されます。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000 |
| 2 | Karun | 25 | Delhi | 1500 |
| 3 | Kaushik | 23 | Kota | 2000 |
| 4 | Chaitanya| 25 | Mumbai | 6500 |
| 5 | Harish | 27 | Bhopal | 8500 |
| 6 | Kamesh | 22 | MP | 4500 |
| 7 | Murali | 24 | Indore | 10000 |
+----+----------+-----+-----------+----------+
削除クエリは、年齢= 25の顧客のレコードデータを削除します。 Rollbackコマンドは、Customerテーブルのこれらの変更をロールバックします。
セーブポイントの例
セーブポイントは、トランザクション全体をロールバックせずに特定のポイントにトランザクションをロールバックできる場合のトランザクションのポイントです。
入力と同じCustomerテーブルを考えてみましょう。
Id | Name | Age | Address | Salary |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Karun | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitanya | 25 | Mumbai | 6500.00 |
5 | Harish | 27 | Bhopal | 8500.00 |
6 | Kamesh | 22 | MP | 1500.00 |
7 | Murali | 24 | Indore | 10000.00 |
この例では、Customersテーブルから3つの異なるレコードを削除することを考えてみましょう。 各削除の前にセーブポイントを作成して、いつでも任意のセーブポイントにロールバックして、適切なデータを元の状態に戻すことができるようにします。
これが一連の操作です。
SAVEPOINT SP1;
DELETE FROM CUSTOMERS WHERE ID = 1;
SAVEPOINT SP2;
DELETE FROM CUSTOMERS WHERE ID = 2;
SAVEPOINT SP3;
DELETE FROM CUSTOMERS WHERE ID = 3;
これで、3つのセーブポイントを作成し、3つのレコードを削除しました。 この状況で、Id 2および3を持つレコードをロールバックする場合は、次のRollbackコマンドを使用します。
ROLLBACK TO SP2;
SP2にロールバックしてから最初の削除のみが行われたことに注意してください。 次のクエリを使用して、顧客のすべてのレコードを表示します。
Select * from Customer;
上記のクエリを実行すると、次の出力が表示されます。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 2 | Karun | 25 | Delhi | 1500 |
| 3 | Kaushik | 23 | Kota | 2000 |
| 4 | Chaitanya| 25 | Mumbai | 6500 |
| 5 | Harish | 27 | Bhopal | 8500 |
| 6 | Kamesh | 22 | MP | 4500 |
| 7 | Murali | 24 | Indore | 10000 |
+----+----------+-----+-----------+----------+
セーブポイントを解放
RELEASEコマンドを使用してセーブポイントを解放できます。 以下は一般的な構文です。
RELEASE SAVEPOINT SAVEPOINT_NAME;