HSQLDB-トランザクション
A Transactionは、データベース操作操作の順次グループであり、実行され、単一の作業単位と見なされます。つまり、すべての操作が正常に実行されると、トランザクション全体が完了します。トランザクション内のいずれかの操作が失敗すると、トランザクション全体が失敗します。
トランザクションのプロパティ
基本的に、トランザクションは4つの標準プロパティをサポートします。それらはACIDプロパティと呼ばれることがあります。
Atomicity −トランザクション内のすべての操作が正常に実行されます。それ以外の場合、トランザクションは失敗した時点で中止され、前の操作は前の位置にロールバックされます。
Consistency −データベースは、トランザクションが正常にコミットされると、状態を適切に変更します。
Isolation −トランザクションが独立して動作し、相互に透過的になることを可能にします。
Durability −システム障害が発生した場合でも、コミットされたトランザクションの結果または効果は持続します。
コミット、ロールバック、およびセーブポイント
これらのキーワードは、主にHSQLDBトランザクションに使用されます。
Commit−常に、COMMITコマンドを実行してトランザクションを成功させる必要があります。
Rollback −トランザクションで障害が発生した場合は、ROLLBACKコマンドを実行して、トランザクションで参照されているすべてのテーブルを以前の状態に戻す必要があります。
Savepoint −ロールバックするトランザクションのグループ内にポイントを作成します。
例
次の例では、トランザクションの概念と、コミット、ロールバック、およびセーブポイントについて説明します。id、name、age、address、salaryの各列を持つCustomersテーブルについて考えてみましょう。
Id | 名前 | 年齢 | 住所 | 給料 |
---|---|---|---|---|
1 | ラメッシュ | 32 | アーメダバード | 2000.00 |
2 | カルン | 25 | デリー | 1500.00 |
3 | カウシク | 23 | コタ | 2000.00 |
4 | チャイタンヤ | 25 | ムンバイ | 6500.00 |
5 | ハリッシュ | 27 | ボパール | 8500.00 |
6 | カメシュ | 22 | MP | 1500.00 |
7 | ムラリ | 24 | インドール | 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の例
次のクエリは、age = 25のテーブルから行を削除し、COMMITコマンドを使用してそれらの変更をデータベースに適用します。
DELETE FROM CUSTOMERS WHERE AGE = 25;
COMMIT;
上記のクエリを実行すると、次の出力が表示されます。
2 rows effected
上記のコマンドが正常に実行されたら、以下のコマンドを実行して、customerテーブルのレコードを確認します。
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 | 名前 | 年齢 | 住所 | 給料 |
---|---|---|---|---|
1 | ラメッシュ | 32 | アーメダバード | 2000.00 |
2 | カルン | 25 | デリー | 1500.00 |
3 | カウシク | 23 | コタ | 2000.00 |
4 | チャイタンヤ | 25 | ムンバイ | 6500.00 |
5 | ハリッシュ | 27 | ボパール | 8500.00 |
6 | カメシュ | 22 | MP | 1500.00 |
7 | ムラリ | 24 | インドール | 10000.00 |
これは、age = 25のテーブルからレコードを削除してから、データベース内の変更をロールバックすることにより、ロールバック機能について説明するクエリの例です。
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の顧客のレコードデータを削除します。ロールバックコマンドは、Customerテーブルでそれらの変更をロールバックします。
セーブポイントの例
セーブポイントは、トランザクション全体をロールバックせずにトランザクションを特定のポイントにロールバックできるトランザクション内のポイントです。
入力と同じCustomerテーブルを考えてみましょう。
Id | 名前 | 年齢 | 住所 | 給料 |
---|---|---|---|---|
1 | ラメッシュ | 32 | アーメダバード | 2000.00 |
2 | カルン | 25 | デリー | 1500.00 |
3 | カウシク | 23 | コタ | 2000.00 |
4 | チャイタンヤ | 25 | ムンバイ | 6500.00 |
5 | ハリッシュ | 27 | ボパール | 8500.00 |
6 | カメシュ | 22 | MP | 1500.00 |
7 | ムラリ | 24 | インドール | 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 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;