Oracle 自治事物详解

版权声明:转载时,请在文章开头明显位置注明出处! https://blog.csdn.net/qq_34745941/article/details/85226896

1、结论

自治事物:自己管理自己,自己的 commit 、rollback 由自己控制,不受主事物影响,也不影响主事物

1.1 思维导图

在这里插入图片描述

1.2 数据准备

CREATE TABLE stu(
   ID   NUMBER,
   NAME VARCHAR2
);

1.2.1 主事物

请注意:先执行 ‘子事物,后执行 主事物’

-- 主事物
CREATE OR REPLACE PROCEDURE p_test_parent(p_flag OUT VARCHAR2) IS
  v_count NUMBER := -1; -- 插入次数
  
BEGIN
  p_flag := '0'; -- 程序执行标志,0:成功,1:失败
  EXECUTE IMMEDIATE 'INSERT INTO stu(ID, xm) VALUES(1, ''father record1'')';
  SELECT COUNT(1) INTO v_count FROM stu;
  dbms_output.put_line('主事物插入一行之后的行数: '||v_count);
  -- commit;
  p_test_son(p_flag);
  SELECT COUNT(1) INTO v_count FROM stu;
  dbms_output.put_line('运行完自治事物后, 主事物的行数: '||v_count);
  -- commit;
  EXCEPTION
     WHEN OTHERS THEN
       p_flag := '1';
       dbms_output.put_line(SQLCODE|| ' : '||SQLERRM);
       dbms_output.put_line(dbms_utility.format_error_backtrace);
END;
/

1.2.2 子事物

CREATE OR REPLACE PROCEDURE p_test_son(p_flag OUT VARCHAR2) IS
  -- PRAGMA AUTONOMOUS_TRANSACTION; 申明 为 自治事物。
   v_count NUMBER := -1; -- 插入次数
   
BEGIN
   p_flag := '0'; -- 程序执行标志,0:成功,1:失败
   EXECUTE IMMEDIATE 'INSERT INTO stu(ID, xm) VALUES(1, ''son record1'')';
   EXECUTE IMMEDIATE 'INSERT INTO stu(ID, xm) VALUES(2, ''son record2'')';
   EXECUTE IMMEDIATE 'INSERT INTO stu(ID, xm) VALUES(3, ''son record3'')';

   SELECT COUNT(1) INTO v_count FROM stu;
   dbms_output.put_line('子事物插入三行之后的行数: ' || v_count);
   commit;
   -- rollback;
   -- dbms_output.put_line('子事物rollback之后的行数: ' || v_count);
EXCEPTION
   WHEN OTHERS THEN
      p_flag := '1';
      dbms_output.put_line(SQLCODE || ' : ' || SQLERRM);
      dbms_output.put_line(dbms_utility.format_error_backtrace);
END;
/

2、没有加自治事物时

主事物插入一行之后的行数: 1
子事物插入三行之后的行数: 4(1+3)
运行完自治事物后, 主事物的行数: 4子 rollback,父 0

3、加自治事物后

主事物插入一行之后的行数: 1
子事物插入三行之后的行数: 3
运行完自治事物后, 主事物的行数: 子commit : 父 4子rollback : 父 1

4、自治事物中的子事物

猜你喜欢

转载自blog.csdn.net/qq_34745941/article/details/85226896