事务就是对数据库执行的工作单元。事务是完成逻辑顺序的工作,无论是在手动方式由用户或者自动地通过某种数据库程序的序列的单元。
事务是一个或多个数据库更改传输。例如,如果创建一个记录或更新记录或删除记录在表上,那么在这个表上可进行事务。重要的是事务控制,以确保数据的完整性和处理数据库错误。
实际上,将很多SQL查询集到一个组,将执行所有这些一起作为事务的一部分。
事务具有以下四个标准属性,通常由首字母缩写ACID简称:
原子: 确保工作单元中的所有操作都成功完成; 否则,该事务被中止的故障点,操作回滚到操作之前的状态。
一致性: 确保数据库正确后成功提交事务更改状态。
隔离: 事务操作彼此独立和透明。
持久性: 可确保提交的事务的结果或仍然存在系统故障的情况下的作用。
用来控制事务有如下命令:
COMMIT: 保存更改。
ROLLBACK: 回滚更改。
SAVEPOINT: 回滚事务组创建点
SET TRANSACTION: 事务放置的名称。
事务控制指令只能用DML命令使用INSERT,UPDATE和DELETE只。它们不能在创建表或删除它们,因为这些操作都是自动提交到数据库中。
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的记录,然后提交更改在数据库中的例子。
SQL> DELETE FROM CUSTOMERS
WHERE AGE = 25;
SQL> 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 的记录,然后回滚改变在数据库中。
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_NAME;
该命令只有在创建中的事务的SAVEPOINT语句中使用。ROLLBACK命令用来取消一组事务。
回滚到SAVEPOINT的语法如下:
ROLLBACK TO SAVEPOINT_NAME;
以下是打算从CUSTOMERS表中删除这三个不同的记录的一个例子。在每个删除之前创建的保存点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 |
+----+----------+-----+-----------+----------+
现在,这里是一系列操作:
SQL> SAVEPOINT SP1;
Saveyiibai created.
SQL> DELETE FROM CUSTOMERS WHERE ID=1;
1 row deleted.
SQL> SAVEPOINT SP2;
Saveyiibai created.
SQL> DELETE FROM CUSTOMERS WHERE ID=2;
1 row deleted.
SQL> SAVEPOINT SP3;
Saveyiibai 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命令用于删除已经创建的一个SAVEPOINT。
RELEASE SAVEPOINT的语法如下:
RELEASE SAVEPOINT SAVEPOINT_NAME;
一旦保存点已被释放,使用ROLLBACK命令不能再撤消自SAVEPOINT进行事务。
SET TRANSACTION命令可以被用来启动一个数据库事务。该命令用于指定随后的事务特性。
例如,可以指定一个事务是只读的,或读写。
SET TRANSACTION的语法如下:
SET TRANSACTION [ READ WRITE | READ ONLY ];