COMMIT命令用于把事务所做的修改保存到数据库,把上一个COMMIT或ROLLBACK命令之后的全部事务都保存到数据库。全部修改都首先被送到临时回退区域,如果这个临时回退区域没有空间了,不能保存对数据库所做的修改,数据库很可能会挂起,禁止进行进一步的事务 *** 作。
语法是:commit [work]。关键字commit是语法中惟一不可缺少的部分,其后是用于终止语句的字符或命令,具体内容取决于不同的实现。关键字work是个选项,其惟一作用是让命令对用户更加友好。
扩展资料:
对于数据库的大规模数据加载或撤消来说,应该多使用COMMIT语句;然而,过多的COMMIT语句会让工作需要大量额外时间才能完成。
在某些实现里,事务不是通过使用COMMIT命令提交的,而是由退出数据库的 *** 作引发提交。但是,在某些实现里,比如MySQL,在执行SETTRANSACTION命令之后,在数据库收到COMMIT或ROLLBACK之前,自动提交功能是不会恢复的。
1. COMMIT WORK 语句执行许多与任务的同步执行有关的功能。ROLLBACK WORK语句“取消”任务同步执行的所有请求。
COMMIT WORK 语句进行下列处理:
• 执行所有由PERFORM ON COMMIT 请求的FORM 例程。
按优先级的升序执行这些例程,顺序由 PERFORM 语句的LEVEL 参数指定。
• 如果请求,触发所有更新任务功能模块。
• 如果请求,触发所有后台任务功能模块。
• 触发数据库提交(依次释放数据库锁定)。
• 清空反转日志。
反转日志包含应用更改前的表格快照。执行反转时,该快照用来将表格复位到原值。
• 关闭所有打开的数据库光标。
• 将所有TEMSE 对象写入永久性文件或数据库。
TEMSE文件是由于性能原因在执行事务期间缓存的临时序列文件。TEMSE文件的示例有假脱机对象或作业日志。
• 将时间片计数器(用于访问工作进程)复位到0。
系统中的时间片计数器限制工作进程中程序运行的时间量。如果程序常常超过时间片限制,则可以使用COMMIT WORK为程序获得更多时间。
但是,要达此目的,必须很容易将处理分为更小单元(全部或没有 *** 作)。然后可以在每个单元之后插入COMMIT WORK 语句。当然处理单元逻辑上必须独立,因为在发生错误时,不能取消前面的单元中所提交的更新。
ROLLBACK WORK“抛弃”当前事务的所有更新:
• 抛弃所有以前用PERFORM ON COMMIT 登录的FORM例程
• 在更新任务队列中将所有以前请求的更新任务功能标记为错误
• 抛弃所有以前请求的后台任务功能
• 从缓冲存储中删除所有TEMSE对象(临时 连续文件,如假脱机对象和作业日志)
• 触发数据库反转 *** 作(依次释放所有数据库锁定)
• 关闭所有打开的数据库光标
2. 以下情况需使用使用COMMIT和ROLLBACK语句。
1) 通过INSERT、UPDATE和MODIFY语句对数据库进行更新事务后。
2) 执行BAPI处理后。一般使用BAPI函数BAPI_TRANSACTION_COMMIT(内含COMMIT语句) 。
3. 如果要保证数据库中当前所作的更改立即被确认,那么就必须使用COMMIT WORK 语句结束LUW。COMMIT WORK 在程序代码中标记了 LUW(几个作业联系在一起形成作业的逻辑单元) 结束并启动更新任务。在COMMIT WORK 语句以后,对数据库所作的所有更改都不能再取消。但是,如果在LUW 中出现了错误,就必须取消已经执行的部分。这意味着当前没有任何插入的行能永久地保存在数据库中。要撤销当前LUW 对数据库的更改,请使用ROLLBACK WORK,它将取消前一次数据库提交后的所有更改。
4. COMMIT WORK [AND WAIT(同步)].
如果使用AND WAIT选项,那么在程序继续执行以前,它要等到更新任务的结束。如果更新是成功的,SY-SUBRC 就设置为0。如果 SY-SUBRC 返回一个非零值,就没有成功的存储所作的更改。
ROLLBACK WORK.
如果对更改的取消是成功的,SY-SUBRC 就设置为0。如果 SY-SUBRC 返回一个非零值,就没有成功地取消所作的更改
首先说明的是COMMIT WORK RELEASE是Pro*C的语法,ORACLE的SQLPLUS和PL/SQL块中不支持这样的写法。譬如:
[oracle@huateng c]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Mon Jan 9 20:43:10 2012
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>COMMIT WORK
Commit complete.
SQL>COMMIT WORK RELEASE
COMMIT WORK RELEASE
*
ERROR at line 1:
ORA-02185: a token other than WORK follows COMMIT
SQL>BEGIN
2COMMIT WORK
3 END
4 /
PL/SQL procedure successfully completed.
SQL>BEGIN
2COMMIT WORK RELEASE
3 END
4 /
COMMIT WORK RELEASE
*
ERROR at line 2:
ORA-06550: line 2, column 15:
PL/SQL: ORA-02185: a token other than WORK follows COMMIT
ORA-06550: line 2, column 3:
PL/SQL: SQL Statement ignored
SQL>
在Pro*C中 COMMIT WORK 会提交事务并释放所有的锁定及其资源,而COMMIT WORK RELEASE会提交事务并释放所有的锁定及其资源
然后断开与数据库的连接,以后所有的与数据库 *** 作的命令都会报ORA-01012错误。
看如下一个简单的Pro*C程序:
[oracle@huateng c]$ cat commit.pc
#include <stdio.h>
#include <string.h>
exec sql include sqlca
void main()
{
exec sql begin declare section
char *username="scott"
char *password="tiger"
char ename[30]
exec sql end declare section
exec sql connect :username identified by :password
exec sql commit work
exec sql select ename into :ename from emp where empno=7788
printf("sqlcode=[%d],ename=[%s]\n",sqlca.sqlcode,ename)
exec sql commit work release
exec sql select ename into :ename from emp where empno=7839
printf("sqlcode=[%d],ename=[%s]\n",sqlca.sqlcode,ename)
exec sql connect :username identified by :password
exec sql select ename into :ename from emp where empno=7844
printf("sqlcode=[%d],ename=[%s]\n",sqlca.sqlcode,ename)
return
}
[oracle@huateng c]$ proc parse=none commit.pc
Pro*C/C++: Release 11.2.0.1.0 - Production on Mon Jan 9 21:05:47 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
System default option values taken from: /appsdata/oracle/product/db11gr2/precomp/admin/pcscfg.cfg
[oracle@huateng c]$ gcc commit.c -o commit -lclntsh -L $ORACLE_HOME/lib
[oracle@huateng c]$ ./commit
sqlcode=[0],ename=[SCOTT]
sqlcode=[-1012],ename=[SCOTT]
sqlcode=[0],ename=[TURNER ]
[oracle@huateng c]$ oerr ora 1012
01012, 00000, "not logged on"
// *Cause:
// *Action:
可以看到第一个SELECT 语句能正常运行,第二个SQL语句就报ORA-01012错误,重新登录后,第三个SELECT又可以正常运行。
[oracle@huateng c]$
SQL>select empno,ename from emp order by 1
EMPNO ENAME
---------- ------------------------------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
14 rows selected.
SQL>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)