关于 DML 语句和事务处理
数据操纵语言 (Data manipulation language,DML) 语句:添加、更改和删除数据库表数据。transaction 是由一个或多个 SQL 语句组成的序列,Oracle AI Database 将这些语句视为一个单元:要么执行所有语句,要么不执行任何语句。
关于事务处理控制语句
transaction 是由一个或多个 SQL 语句组成的序列,Oracle AI Database 将这些语句视为一个单元:要么执行所有语句,要么不执行任何语句。对要求将多项操作作为一个单元执行的业务流程进行建模时,需要使用事务处理。
例如,当某位经理离开公司时,必须向 JOB_HISTORY 表中插入一行以显示该经理离职的时间,并且对于该经理的每个下级员工,必须更新 EMPLOYEES 表中 MANAGER_ID 的值。要在应用程序中对此过程进行建模,则必须将 INSERT 和 UPDATE 语句组合成单个事务处理。
基本事务处理控制语句包括:
-
SAVEPOINT,可在事务处理中标记保存点,您可以稍后回退到此点。保存点是可选的,事务处理可以包含多个保存点。
-
COMMIT,可结束当前事务处理,使其更改变成永久更改,擦除其保存点,并释放锁。
-
ROLLBACK,可回退(撤消)当前整个事务处理,或仅回回退在指定保存点后所做的更改。
在 SQL*Plus 环境中,可以在 SQL> 提示符后输入事务处理控制语句。
在 SQL Developer 环境中,可以在工作表中输入事务处理控制语句。SQL Developer 还包含“提交更改”和“回退更改”图标,具体说明详见“提交事务处理”和“回退事务处理”。
注意:
如果您未显式提交事务处理,而且程序异常终止,则数据库会自动回退上次未提交的事务处理。
Oracle 建议在应用程序中通过提交或回退事务处理来显式结束这些事务处理。
另请参见:
-
Oracle AI Database Concepts,了解有关事务处理管理的更多信息
-
Oracle AI Database SQL Language Reference(了解有关事务处理控制语句的详细信息)
提交事务处理
提交事务处理会使更改变为永久更改,擦除保存点并释放锁。
要显式提交事务处理,请使用 COMMIT 语句,或(在 SQL Developer 环境中)使用提交更改图标。
注:Oracle AI Database 在任何数据定义语言 (DDL) 语句之前和之后发出隐式 COMMIT 语句。有关 DDL 语句的信息,请参阅“关于数据定义语言 (DDL) 语句”。
在提交事务处理之前:
-
您所做的更改对您可见,但对数据库实例的其他用户不可观。
-
您所做的更改不是最终的更改,即可以使用 ROLLBACK 语句撤消这些所做的更改。
在提交事务处理后:
-
您所做的更改对其他用户可见,而且对其他用户在您提交事务处理之后运行的那些语句可见。
-
您所做的更改是最终的更改,即无法使用 ROLLBACK 语句撤消这些更改。
示例 3-1 会向 REGIONS 表中添加一行(这是个非常简单的事务处理),检查结果,然后提交事务处理。
示例 3-1 提交交易
在事务处理之前:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
结果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
4 rows selected.
事务处理 (向表添加行):
INSERT INTO regions (region_id, region_name) VALUES (5, 'Africa');
结果:
1 row created.
检查是否已添加行:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
结果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
提交事务处理:
COMMIT;
结果:
Commit complete.
另请参阅: Oracle AI Database SQL Language Reference 以了解有关 COMMIT 语句的信息
回退事务处理
回退事务处理会撤消其更改。您可以回退当前整个事务处理,或仅将其回退到指定的保存点。
要将当前事务处理仅回退到指定的保存点,则必须使用包含 TO SAVEPOINT 子句的 ROLLBACK 语句。
要回退当前整个事务处理,请使用不包含 TO SAVEPOINT 子句的 ROLLBACK 语句,或(在 SQL Developer 环境中)使用回退更改图标。
回退当前整个事务处理:
-
结束事务处理
-
还原其所有更改
-
擦除其所有保存点
-
释放所有事务处理锁
仅将当前事务处理回退到指定的保存点:
-
不结束事务处理
-
仅还原在指定的保存点后所做的更改
-
仅擦除在指定的保存点后设置的保存点 (排除指定的保存点本身)
-
释放在指定的保存点后获取的所有表和行的锁
请求访问在指定的保存点后锁定的行的其他事务处理必须继续等待,直到提交或回退该事务处理为止。未请求这些行的其他事务处理可以立即请求并访问这些行。
要在 SQL Developer 中查看回退的效果,可能必须单击刷新图标。
作为示例 3-1 的结果,REGIONS 表包含一个称为“中东和非洲”的区域和一个称为“非”的区域。示例 3-2 会更正此问题(这是一个非常简单的事务处理)并检查更改,但接着回退事务处理,然后检查回退。
示例 3-2 回退整个事务处理
在事务处理之前:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
结果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
事务处理 (更改表):
UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';
结果:
1 row updated.
检查更改:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
结果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
回退事务处理:
ROLLBACK;
结果:
Rollback complete.
检查回退:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
结果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
另请参阅: Oracle AI Database SQL Language Reference 以了解有关 ROLLBACK 语句的信息
在事务处理中设置保存点
SAVEPOINT 语句可在事务处理中标记保存点,即以后可以回退到此点。保存点是可选的,事务处理可以包含多个保存点。示例 3-3 执行一个包含多个 DML 语句和几个保存点的事务处理,然后将事务处理回退到一个保存点,以便仅撤消在该保存点之后所做的更改。
示例 3-3 将事务处理回退到保存点
在事务处理之前检查 REGIONS 表:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
结果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
在事务处理之前检查区域 4 中的国家/地区:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
结果:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 4
Israel IL 4
Kuwait KW 4
Nigeria NG 4
Zambia ZM 4
Zimbabwe ZW 4
6 rows selected.
在事务处理之前检查区域 5 中的国家/地区:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
结果:
no rows selected
包含几个保存点的事务处理:
UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'ZM';
SAVEPOINT zambia;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'NG';
SAVEPOINT nigeria;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'ZW';
SAVEPOINT zimbabwe;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'EG';
SAVEPOINT egypt;
在事务处理之后检查 REGIONS 表:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
结果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
在事务处理之后检查区域 4 中的国家/地区:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
结果:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Israel IL 4
Kuwait KW 4
2 rows selected.
在事务处理之后检查区域 5 中的国家/地区:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
结果:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 5
Nigeria NG 5
Zambia ZM 5
Zimbabwe ZW 5
4 rows selected.
ROLLBACK TO SAVEPOINT nigeria;
在回退之后检查 REGIONS 表:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
结果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
在回退之后检查区域 4 中的国家/地区:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
结果:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 4
Israel IL 4
Kuwait KW 4
Zimbabwe ZW 4
4 rows selected.
在回退之后检查区域 5 中的国家/地区:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
结果:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Nigeria NG 5
Zambia ZM 5
2 rows selected.
另请参阅: Oracle AI Database SQL Language Reference(了解有关 SAVEPOINT 语句的信息)