
DDL语言,比如create,drop等改变表结构的,就不需要写commit(因为内部隐藏了commit)
DDL 数据定义语言:
create table 创建表
alter table 修改表
drop table 删除表
truncate table 删除表中所有行
create index 创建索引
drop index 删除索引
当执行DDL语句时,在每一条语句前后,oracle都将提交当前的事务。如果用户使用insert命令将记录插入到数据库后,执行了一条DDL语句(如create
table),此时来自insert命令的数据将被提交到数据库。当DDL语句执行完成时,DDL语句会被自动提交,不能回滚。
DML 数据 *** 作语言:
insert 将记录插入到数据库
update 修改数据库的记录
delete 删除数据库的记录
当执行DML命令如果没有提交,将不会被其他会话看到。除非在DML命令之后执行了DDL命令或DCL命令,或用户退出会话,或终止实例,此时系统会自动
发出commit命令,使未提交的DML命令提交。
oracle的commit就是提交数据(这里是释放锁不是锁表),在未提交前你前面的 *** 作更新的都是内存,没有更新到物理文件中。执行commit从用户角度讲就是更新到物理文件了,事实上commit时还没有写date file,而是记录了redo log file,要从内存写到data物理文件,需要触发检查点,由DBWR这个后台进程来写,这里内容有点多的,如果不深究的话你就理解成commit即为从内存更新到物理文件。
锁有很多种,一般我们关注的都是DML *** 作产生的,比如insert,delete,update,select...for update都会同时触发表级锁和行级锁
补充:对的,insert以后commit之前是锁表的状态,其他事务无法对该表进行 *** 作。
1.commit_form和commit
都对form和数据库进行提交。针对form上面的数据变动提交到后台数据库,同时数据库提交数据。
2.
do_key('commit_form')
它会首先执行key-commit触发器里面的代码,如果没有这个触发器,则会做commit_form一样的 *** 作。
3.
forms_dll('commit')
只针对代码中insert、update、delete语句进行提交,form上面的数据不提交。
dg
里面提到:
replace
commit
with
do_key('commit_form'),
this
routine
raises
the
exception
form_trigger_failure
if
there
is
an
invalid
record.
commit时触发器执行顺序:
(1).key-commit
(2).pre-commit
(3).pre/on/post
delete
(4).pre/on/post
update
(5).pre/on/post
insert
(6).on-commit
(7).post
database
commit
4.
quietcommit
oracle
form
"悄悄"
提交。如果使用commit_form的话会d出信息提示"没有修改需要保存"或者"xxx记录已保存"。如果你不想提示出现,则可以调用函数
app_form.quietcommit。由于是一个function,
所以需要定义一个变量用来接收返回值,
返回值类型为boolean,当true的时候就说明成功,
否则commit失败。
将系统的消息级别改为较低级别也可调用如下过程:procedure
docommit
is
old_level
varchar2(2)
begin
old_level
:=
name_in('system.message_level')
copy('5',
'system.message_level')
commit
copy(old_level,
'system.message_level')
end
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)