对于事物的疑惑

LJY_AINILU 2009-04-23 04:01:57
现在对事物的理解有些不够透彻
比如
存储过程A
和纯初过程B
A 和 B都没有提交的功能
A在执行的时候 调用B过程了

那么 A过程 和 B过程 现在算是一个事物么

如果A和B都有提交语句
那么他们之间的调用 是事物之间的调用么
...全文
105 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mosaic 2009-04-24
  • 打赏
  • 举报
回复
还有一种情况需要注意一下,如果存储过程中有DDL语句(动态SQL),比如create table, alter table之类的,会隐式的自动提交事务。
  • 打赏
  • 举报
回复

SQL> set serveroutput on
SQL> create table test_table_2 (
2 id number(10.0), name varchar2(20));

表已创建。

SQL> select * from test_table_2;

未选定行

SQL> insert into test_table_2 values (1,'a');

已创建 1 行。

SQL> select * from test_table_2;

ID NAME
---------- --------------------
1 a

SQL> create or replace procedure ttest_1
2 is
3 begin
4 dbms_output.put_line('进入ttest_1');
5 insert into test_table_2 values (2,'b');
6 dbms_output.put_line('插入数据ttest_1');
7 commit;
8 dbms_output.put_line('commit 在 ttest_1');
9 end;
10 /

过程已创建。

SQL> exec ttest_1
进入ttest_1
插入数据ttest_1
commit 在 ttest_1

PL/SQL 过程已成功完成。

SQL> select * from test_table_2;

ID NAME
---------- --------------------
1 a
2 b

SQL> truncate table test_table_2;

表被截断。

SQL> select * from test_table_2;

未选定行


SQL> create or replace procedure ttest_2
2 is
3 begin
4 dbms_output.put_line('进入ttest_2');
5 insert into test_table_2 values(5,'m');
6 dbms_output.put_line('插入数据ttest_2');
7 ttest_1;
8 dbms_output.put_line('调用过程ttest_1');
9 commit;
10 dbms_output.put_line('commit 在 ttest_2');
11 end;
12 /

过程已创建。

SQL> exec ttest_2
进入ttest_2
插入数据ttest_2
进入ttest_1
插入数据ttest_1
commit 在 ttest_1
调用过程ttest_1
commit 在 ttest_2

PL/SQL 过程已成功完成。

SQL> select * from test_table_2;

ID NAME
---------- --------------------
5 m
2 b

SQL>


楼主自己写个测试一下不就行了,看这个对你有帮助吗?
LJY_AINILU 2009-04-24
  • 打赏
  • 举报
回复
mumu_java
2,
如果A和B都有提交语句
A在执行的时候 调用B过程了
A,B是两个事务。


那么 对于对二种情况oracle 是怎么分辨的呢
如果A和B都有提交语句 那么A在提交前调用了B 然后 A在提交 ORACLE 是怎么判断这样的情况的?
谢谢
mumu_java 2009-04-23
  • 打赏
  • 举报
回复
1楼说的是自治事务。
mumu_java 2009-04-23
  • 打赏
  • 举报
回复
存储过程不会自动commit,你只能手动写commit语句,否则不提交。
1,
A 和 B都没有提交的功能
A在执行的时候 调用B过程了
A,B当然是一个事务。
2,
如果A和B都有提交语句
A在执行的时候 调用B过程了
A,B是两个事务。
willflyz 2009-04-23
  • 打赏
  • 举报
回复
他们之间算是同一个事务,比如A中执行了insert,update.. 没用提交,这时调用了B,B里面执行了commit提交了事务,那么A中的事务也将被提交,如果你想让他们独立处理自己的事务必须在过程声明处加了Pragma Autonomous_Transaction;

create or replace PTest(p number)
is
Pragma Autonomous_Transaction;
begin
...
commit;//这样只会提交本过程的事务
end;

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧