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 查询DML操作结果
从图12.1中可以看出DML操作数据成功。注意,此时还没有提交事务的操作。
2)以同样用户登录新的SQLPlus,我们称该窗口为SQLPlus2。同样查询表PRODUCTINFO的数据,查看数据修改情况。查询结果见图12.2。
图 12.2 新会话查询表PRODUCTINFO数据
此时可以发现,当会话一的事务没有提交时,会话二不能查看到会话一修改的数据。
3)在SQL*Plus1窗口提交事务。具体脚本如下:
COMMIT;
执行完成会有如下提示:
提交完成
4)当事务提交完成后,SQL*Plus2窗口再次查询PRODUCTINFO表数据,结果见图12.3。
图 12.3 提交事务后查询结果
此时可以发现事务一旦提交,SQL*Plus就能查询到修改的数据。由此可以看出,事务可以保证数据的一致性。