我发现有人经常 “滥用” ORACLE 中的 COMMIT 和 ROLLBACK 的用法。
首先,大家要清楚 COMMIT / ROLLBACK ,都是用在执行 DML 语句之后的。所谓 DML 语句就是 INSERT / DELETE / UPDATE / SELECT ,而 CREATE TABLE / VIEW
之类的语句,是 DDL。
DML 语句,执行完之后,处理的数据,都会放在回滚段中(除了 SELECT 语句),等待用户进行提交(COMMIT)或者回滚 (ROLLBACK),当用户执行 COMMIT / ROLLBACK
后,放在回滚段中的数据就会被删除。
所有的 DML 语句都是要显式提交了,所谓“显式提交”,就是要执行 COMMIT / ROLLBACK 。
而其他的诸如 DDL 语句的,都是隐式提交的。就是说,不用进行 COMMIT / ROLLBACK 。在运行那些非 DML 语句后,ORACLE 已经进行了隐式提交,例如
CREATE TABLE,在运行脚本后,表已经建好了,并不在需要你再进行显式提交。
首先,大家要清楚 COMMIT / ROLLBACK ,都是用在执行 DML 语句之后的。所谓 DML 语句就是 INSERT / DELETE / UPDATE / SELECT ,而 CREATE TABLE / VIEW
之类的语句,是 DDL。
DML 语句,执行完之后,处理的数据,都会放在回滚段中(除了 SELECT 语句),等待用户进行提交(COMMIT)或者回滚 (ROLLBACK),当用户执行 COMMIT / ROLLBACK
后,放在回滚段中的数据就会被删除。
所有的 DML 语句都是要显式提交了,所谓“显式提交”,就是要执行 COMMIT / ROLLBACK 。
而其他的诸如 DDL 语句的,都是隐式提交的。就是说,不用进行 COMMIT / ROLLBACK 。在运行那些非 DML 语句后,ORACLE 已经进行了隐式提交,例如
CREATE TABLE,在运行脚本后,表已经建好了,并不在需要你再进行显式提交。
---------------------
说白了,对Oracle来说,分为DML(增删改查)和DDL(建表删除表)两种。但凡Oracle碰到DDL语句,实际上是做的如下动作:
{insert into dba_XXX
commit}
若不插入字典,后面的动作会出现字典不匹配的情况,所以一Commit必然会将DDL语句之前的动作统一提交,假如这个情况出现在存储过程 中,则DDL前面的增删改全部被提交了,会出现问题。所以DDL语句最好放在其它地方,以我的程序为例,建表删表是放在日结中。
对SqlServer来说,建表删表这些动作,没有隐式提交的提交,是由事务启动开始一直到结束统一完成的,增删改和建表删表在一起提交,所以无需
担心。
所以那些对显式提交有疑问的人,希望这篇文章对大家有用。
PS:SELECT 语句执行后,数据都存在 共享池。提供给其他人查询相同的数据时,直接在共享池中提取,不用再去数据库中提取,提高了数据查询的速度。
不过大家要注意:所谓提供给其他人查询相同的数据,有很多的条件限制,不在本篇中详说,请在“共享池的使用注意”一文中在详细说明。
不过大家要注意:所谓提供给其他人查询相同的数据,有很多的条件限制,不在本篇中详说,请在“共享池的使用注意”一文中在详细说明。