1.Oracle事务不会自动提交。通常情况下,oralce将整个存储过程作为一个事务整体,整个过程内的事务,要么都提交,要么都回滚。
2.如果过程内部使用了commit命令或rollback命令,则存储过程就能够自行控制整个事务的结束时机,而不受整个会话的影响。
3.如果程序报异常,走到了exception里,则procedure会挂在那里,不会自动提交。
4.如果存储过程中有锁表(行)操作, 如不显式commit,则procedure会挂在那里,不会自动提交。锁表是同步操作,此时其他调用该procedure的只能等待。
5.procedure中 事务控制语句模版:
begin
insert into ....commit;--提交
exception
when others then
rollback;--当发生错误,回滚整个存储过程(rollback和commit是事务的同一级别,所以此处有rollback就ok了)
end;
6.框架中spring会自动给存储过程提交,这种行为并不是存储过程的行为。
eg.
create tabel test_lyh (a integer, b varchar2(30) not null);--建表语句
-------
例1:
create or replace procedure p_test_lyh( a integer, b varchar2)--参数不能带长度, b varchar2(10)是错的;默认是入参,in可省略,out要显式标注 如:b out integer;
is--在过程和函数中没有使用关键词DECLARE,取而代之的是关键字IS或AS(declare用在匿名程序段中,声明变量)。
c varcha2(10);--变量在 is关键字后声明,需要带长度
begin
update test_lyh t set t.a=6 where t.b=1;
insert into test_lyh values(3, 3);
insert into test_lyh values(4,null);
exception
when others then
dbms_output.put_line('error');
end p_test_lyh;
当单独执行上述存储过程,该存储过程会挂起(即未commit状态)。
在框架中调用此存储过程,结果:A B
------------
3 3 (自动提交了)
-----------
例2:
create or replace procedure p_test_lyh( a integer, b varchar2)--入参不能带长度, b varchar2(10)是错的。
is
c varcha2(10);--变量在 is关键字后声明,需要带长度
begin
update test_lyh t set t.a=6 where t.b=1;
insert into test_lyh values(3, 3);
insert into test_lyh values(4,null);
exception
when others then
dbms_output.put_line('error');
rollback;
end p_test_lyh;
当单独执行上述存储过程,存储过程会回滚到最初状态。表里无记录。框架调用此过程,效果一样。
7.备注:可以声明无参存储过程,如:
create or replace procedure p_test_lyh
is
...
begin
...
end p_test_lyh;
但是无参存储过程不能带个空的括号,create or replace procedure p_test_lyh() 是错的。
调用的时候则可带可不带空的括号。