12.1.2 事务的类型

事务分为如下两种类型。

(1)显式方式

所谓的“显式方式”,就是利用命令完成。语法如下:


01 新事务开始

02 sql statement

03 …

04 COMMIT|ROLLBACK;


【语法说明】

❑第2~3行表示事物内的SQL语句,可以是单条,也可以是多条。

❑第4行表示事务的提交或回滚。

Oracle中的事务不需要设置开始标志。通常有下列情况之一时,事务会开启:

❑登录数据库后,第一次执行DML语句。

❑当事务结束后,第一次执行DML语句。

(2)隐式方式

该类型的事务没有明确的开始和结束标志。它由数据库自动开启,当一个程序正常结束或使用DDL语言时会自动提交,而操作失败时也会自动回滚。如果设置AUTOCOMMIT为打开状态(默认关闭),则每次执行DML操作都会自动提交。命令语法如下:


SET AUTOCOMMIT ON/OFF


事务在什么条件下结束读者需要注意,否则有丢失数据的可能。当有下列情况之一时,事务会结束:

❑使用COMMIT事务提交,ROLLBACK事务回滚。

❑执行DDL语句,事务自动提交。例如,使用CREATE、DROP、GRANT、REVOKE等命令。

❑正常退出SQL*Plus时自动提交事务,非正常退出则ROLLBACK事务回滚。

事务可以保证数据的一致性。前面已经介绍过,事务没有提交时,当前会话所做的操作其他会话不会看到,下面用示例1来演示。

【示例1】使用事务保证数据的一致性

演示事务如何保证数据的一致性,这里分为如下4个步骤:

1)登录SQLPlus,我们称该窗口为SQLPlus1。执行如下两条语句:


UPDATE PRODUCTINFO SET DESPERATION='促销产品';

INSERT INTO PRODUCTINFO VALUES('0240090001','一致性测试',1000,0,0000000000,NULL,'测试');


当以上操作提示成功后,查询PRODUCTINFO表的内容,验证数据是否修改成功,结果见图12.1。

12.1.2 事务的类型 - 图1

图 12.1 查询DML操作结果

从图12.1中可以看出DML操作数据成功。注意,此时还没有提交事务的操作。

2)以同样用户登录新的SQLPlus,我们称该窗口为SQLPlus2。同样查询表PRODUCTINFO的数据,查看数据修改情况。查询结果见图12.2。

12.1.2 事务的类型 - 图2

图 12.2 新会话查询表PRODUCTINFO数据

此时可以发现,当会话一的事务没有提交时,会话二不能查看到会话一修改的数据。

3)在SQL*Plus1窗口提交事务。具体脚本如下:


COMMIT;


执行完成会有如下提示:


提交完成


4)当事务提交完成后,SQL*Plus2窗口再次查询PRODUCTINFO表数据,结果见图12.3。

12.1.2 事务的类型 - 图3

图 12.3 提交事务后查询结果

此时可以发现事务一旦提交,SQL*Plus就能查询到修改的数据。由此可以看出,事务可以保证数据的一致性。