版权声明:转载时,请在文章开头明显位置注明出处! 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