如下,新建兩個存儲過程:
在主自治事務中,我們插入一條記錄,然后在自治事務中,查看表中行數,然后嘗試插入三條記錄,查看行數,最后rollback 查看行數,最后返回主事務,查看行數。
1、如下代碼:
--主事務 PROCEDURE p_test_at_and_mt IS cnt NUMBER := -1; BEGIN INSERT INTO msg VALUES ('father Record'); SELECT COUNT(*) INTO cnt FROM msg; dbms_output.put_line('主事務插入一行之后行數:' || cnt); p_test_at_and_mt_son; dbms_output.put_line('運行子自治事務之后,主事務的行數:' || cnt); --COMMIT; END p_test_at_and_mt; --測試自治事務(子自治) PROCEDURE p_test_at_and_mt_son IS PRAGMA AUTONOMOUS_TRANSACTION; cnt NUMBER := -1; BEGIN SELECT COUNT(*) INTO cnt FROM msg; dbms_output.put_line('插入三條記錄之前子自治事務行數:' || cnt); ROLLBACK; INSERT INTO msg VALUES ('son Record1'); INSERT INTO msg VALUES ('son Record2'); INSERT INTO msg VALUES ('son Record3'); SELECT COUNT(*) INTO cnt FROM msg; dbms_output.put_line('插入三條記錄之后子自治事務行數:' || cnt); ROLLBACK; SELECT COUNT(*) INTO cnt FROM msg; dbms_output.put_line('Rollback之后,子自治事務行數:' || cnt); --COMMIT; END p_test_at_and_mt_son;
測試主事務存儲過程,結果如下:
主事務插入一行之后行數:1 插入三條記錄之前子自治事務行數:0 插入三條記錄之后子自治事務行數:3 Rollback之后,子自治事務行數:0 運行子自治事務之后,主事務的行數:1
可以看到,在運行從主事務,沒有提交的事務,在子自治事務中是看不到的。但是在他主事務本身中沒有提交也能看到插入了一條記錄。
2、當我們將第二個存儲過程,做點修改,假如下面着色部分兩行,並且提交,我們運行主事務,看看有什么反映。
PROCEDURE p_test_at_and_mt_son IS PRAGMA AUTONOMOUS_TRANSACTION; cnt NUMBER := -1; BEGIN SELECT COUNT(*) INTO cnt FROM msg; dbms_output.put_line('插入三條記錄之前子自治事務行數:' || cnt); ROLLBACK; INSERT INTO msg VALUES ('son Record1'); INSERT INTO msg VALUES ('son Record2'); INSERT INTO msg VALUES ('son Record3'); SELECT COUNT(*) INTO cnt FROM msg; dbms_output.put_line('插入三條記錄之后子自治事務行數:' || cnt); ROLLBACK; SELECT COUNT(*) INTO cnt FROM msg; dbms_output.put_line('Rollback之后,子自治事務行數:' || cnt); INSERT INTO msg VALUES ('son Record4'); SELECT COUNT(*) INTO cnt FROM msg; --子事務插入最后一條 COMMIT; END p_test_at_and_mt_son;
運行結果:
主事務插入一行之后行數:1 插入三條記錄之前子自治事務行數:0 插入三條記錄之后子自治事務行數:3 Rollback之后,子自治事務行數:0 運行子自治事務之后,主事務的行數:1
竟然和第一個完全一樣,可是我們在子自治事務中明明commit了啊,按照如果不加下面這一句的申明,那么我們可以肯定,看到的是 2(最后)
PRAGMA AUTONOMOUS_TRANSACTION;
看下,數據改變情況可以發現,我們的第一條,和子自治的最后commit的一條都插入了,進去。 自治,就是這個意思啦。

3、在做點修改,如下,直接插入三條記錄,commit我們再次運行主事務,看結果:
PROCEDURE p_test_at_and_mt_son IS PRAGMA AUTONOMOUS_TRANSACTION; cnt NUMBER := -1; BEGIN SELECT COUNT(*) INTO cnt FROM msg; dbms_output.put_line('插入三條記錄之前子自治事務行數:' || cnt); ROLLBACK; INSERT INTO msg VALUES ('son Record1'); INSERT INTO msg VALUES ('son Record2'); INSERT INTO msg VALUES ('son Record3'); SELECT COUNT(*) INTO cnt FROM msg; dbms_output.put_line('插入三條記錄之后子自治事務行數:' || cnt); COMMIT; END p_test_at_and_mt_son;
結果如下:
主事務插入一行之后行數:1 插入三條記錄之前子自治事務行數:0 插入三條記錄之后子自治事務行數:3 運行子自治事務之后,主事務的行數:1
相信到這里就知道了,主事務,看不到子事務的,commit rollback的操作,即:他們互相獨立。
因為,我們在主事務中,沒有寫commit,你可以在運行過程中調試的時候,手動 按下rollback的按鈕,你可以看到。后台把子事務的事務處理提交到了數據庫。
總之:相互獨立,不影響,不干擾,看到的數據也是。
分享共進步!
謝謝閱讀!