標籤:
如下,建立兩個預存程序:
在主自治事務中,我們插入一條記錄,然後在自治事務中,查看錶中行數,然後嘗試插入三條記錄,查看行數,最後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插入三條記錄之後子自治事務行數:3Rollback之後,子自治事務行數: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插入三條記錄之後子自治事務行數:3Rollback之後,子自治事務行數: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的按鈕,你可以看到。後台把子事務的交易處理提交到了資料庫。
總之:相互獨立,不影響,不干擾,看到的資料也是。
分享共進步!
謝謝閱讀!
Oracle自治事務實際用例