现在对事物的理解有些不够透彻
比如 
存储过程A 
和纯初过程B
A 和 B都没有提交的功能
A在执行的时候 调用B过程了那么 A过程 和 B过程 现在算是一个事物么如果A和B都有提交语句
那么他们之间的调用 是事物之间的调用么

解决方案 »

  1.   

    他们之间算是同一个事务,比如A中执行了insert,update.. 没用提交,这时调用了B,B里面执行了commit提交了事务,那么A中的事务也将被提交,如果你想让他们独立处理自己的事务必须在过程声明处加了Pragma Autonomous_Transaction;

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

  2.   

    存储过程不会自动commit,你只能手动写commit语句,否则不提交。
    1,
    A 和 B都没有提交的功能 
    A在执行的时候 调用B过程了
    A,B当然是一个事务。
    2,
    如果A和B都有提交语句
    A在执行的时候 调用B过程了
    A,B是两个事务。
      

  3.   

    mumu_java
    2,
    如果A和B都有提交语句
    A在执行的时候 调用B过程了
    A,B是两个事务。
    那么 对于对二种情况oracle 是怎么分辨的呢
    如果A和B都有提交语句  那么A在提交前调用了B  然后 A在提交  ORACLE 是怎么判断这样的情况的?
    谢谢
      

  4.   


    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 aSQL> 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_1PL/SQL 过程已成功完成。SQL> select * from test_table_2;        ID NAME
    ---------- --------------------
             1 a
             2 bSQL> 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_2PL/SQL 过程已成功完成。SQL> select * from test_table_2;        ID NAME
    ---------- --------------------
             5 m
             2 bSQL> 
    楼主自己写个测试一下不就行了,看这个对你有帮助吗?
      

  5.   

    还有一种情况需要注意一下,如果存储过程中有DDL语句(动态SQL),比如create table, alter table之类的,会隐式的自动提交事务。