由于您不了解 Transaction,因此目前作为解决方案,只需在完成插入后键入“commit”命令即可。并对“交易”做一些研究。希望这对您有所帮助。
详情如下:
首先什么是交易?
回答:
通常,对数据库的多个操作构成一个逻辑工作单元。一个
示例是资金转移。让我们考虑一所拥有许多部门的大学。每个部门都有资金,现在你想将一个部门的资金转移到另一个部门,其中一个部门账户(比如A)被借记,另一个部门账户(比如B)被记入贷方。
很明显,要么贷记和借记要么都发生,要么都不发生,这一点很重要。也就是说,资金转移必须全部发生或根本不发生。这种全有或全无的要求称为原子性。
此外,资金转移的执行必须保持数据库的一致性。也就是说,必须保留 A 和 B 余额之和的值。这种正确性要求称为一致性。
最后,在成功执行资金转帐后,帐户 A 和 B 的余额的新值必须保持不变,尽管可能出现系统故障。这种持久性要求称为持久性。
事务是执行单个逻辑的操作的集合
数据库应用程序中的功能。每个事务都是原子性和一致性的一个单元。因此,我们要求事务不违反任何数据库一致性约束。也就是说,如果在事务开始时数据库是一致的,那么在事务成功终止时数据库必须是一致的。但是,在执行交易期间,可能需要暂时允许不一致,因为 A 的借记或 B 的贷记必须先于另一个完成。这种暂时的不一致虽然是必要的,但如果发生故障,可能会导致困难。
程序员有责任正确定义各种事务,以便每个事务都保持数据库的一致性。例如,将资金从 A 部门账户转移到 A 部门账户的交易
B 部门可以定义为由两个独立的程序组成:一个
借记帐户 A,另一个贷记帐户 B。执行这些
两个程序一个接一个确实会保持一致性。然而,每个
程序本身不会将数据库从一致状态转换为新状态
一致的状态。因此,这些程序不是事务。
确保原子性和持久性是我们的责任
数据库系统本身——特别是恢复管理器。在缺少...之下
失败,所有事务都成功完成,原子性很容易实现。
但是,由于各种类型的失败,事务可能并不总是成功地完成其执行。如果我们要确保原子性属性,失败的事务必须对数据库的状态没有影响。
因此,必须将数据库恢复到相关事务开始执行之前的状态。数据库系统必须先进行故障恢复,即检测系统故障并将数据库恢复到故障发生前的状态。
最后,当多个事务同时更新数据库时,即使每个单独的事务都是正确的,数据的一致性也可能不再保持。并发控制管理器负责控制并发事务之间的交互,以确保数据库的一致性。事务管理器由并发控制管理器和恢复管理器组成。事务的概念已广泛应用于数据库系统和应用程序中。虽然交易最初用于金融应用程序,但该概念现在用于电信的实时应用程序,以及产品设计或管理工作流程等长期活动的管理。
SQL 中的现在事务:
事务控制:
有以下用于控制事务的命令:
COMMIT: to save the changes.
ROLLBACK: to rollback the changes.
SAVEPOINT: creates points within groups of transactions in which to ROLLBACK
SET TRANSACTION: Places a name on a transaction.
事务控制命令仅与 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。在创建或删除表时不能使用它们,因为这些操作会自动提交到数据库中。
COMMIT 命令:
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 |
+----+----------+-----+-----------+----------+
以下示例将从表中删除年龄为 25 的记录,然后提交数据库中的更改。
SQL> DELETE FROM CUSTOMERS
WHERE AGE = 25;
SQL> COMMIT;
因此,表中的两行将被删除,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 |
+----+----------+-----+-----------+----------+
以下是示例,它将从表中删除年龄 = 25 的记录,然后回滚数据库中的更改。
SQL> DELETE FROM CUSTOMERS
WHERE AGE = 25;
SQL> 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 命令的语法如下:
SAVEPOINT SAVEPOINT_NAME;
此命令仅用于在事务语句之间创建 SAVEPOINT。 ROLLBACK 命令用于撤销一组事务。
回滚到 SAVEPOINT 的语法如下:
ROLLBACK TO SAVEPOINT_NAME;
以下是您计划从 CUSTOMERS 表中删除三个不同记录的示例。您想在每次删除之前创建一个 SAVEPOINT,以便您可以随时 ROLLBACK 到任何 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 |
+----+----------+-----+-----------+----------+
现在,这是一系列操作:
SQL> SAVEPOINT SP1;
Savepoint created.
SQL> DELETE FROM CUSTOMERS WHERE ID=1;
1 row deleted.
SQL> SAVEPOINT SP2;
Savepoint created.
SQL> DELETE FROM CUSTOMERS WHERE ID=2;
1 row deleted.
SQL> SAVEPOINT SP3;
Savepoint created.
SQL> DELETE FROM CUSTOMERS WHERE ID=3;
1 row deleted.
现在三个删除操作已经发生,假设您改变了主意并决定回滚到您确定为 SP2 的 SAVEPOINT。因为 SP2 是在第一次删除之后创建的,所以最后两次删除被撤消:
SQL> ROLLBACK TO SP2;
Rollback complete.
请注意,自从您回滚到 SP2 后,只发生了第一次删除:
SQL> SELECT * FROM CUSTOMERS;
+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+
6 rows selected.
RELEASE SAVEPOINT 命令:
RELEASE SAVEPOINT 命令用于删除您创建的 SAVEPOINT。
RELEASE SAVEPOINT 的语法如下:
RELEASE SAVEPOINT SAVEPOINT_NAME;
一旦 SAVEPOINT 被释放,您就不能再使用 ROLLBACK 命令撤消自 SAVEPOINT 以来执行的事务。
SET TRANSACTION 命令:
SET TRANSACTION 命令可用于启动数据库事务。该命令用于指定后续交易的特征。
例如,您可以将事务指定为只读或读写。
SET TRANSACTION 的语法如下:
SET TRANSACTION [ READ WRITE | READ ONLY ];
所以现在如果想查看您从 net-beans 到 sql-plus 所做的更改,您可以使用 commit 命令,反之亦然。一件事是在sql-plus中如果你只是关闭sqlplus窗口,那么它将自动回滚到它的起始位置,如果不使用commit命令而只需输入exit从@出来987654341@,然后它会自动提交。但不要这样做,这是一种不好的做法。