以下,新建兩個存儲過程:數據庫
在主自治事務中,咱們插入一條記錄,而後在自治事務中,查看錶中行數,而後嘗試插入三條記錄,查看行數,最後rollback 查看行數,最後返回主事務,查看行數。測試
一、以下代碼:spa
--主事務 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
能夠看到,在運行從主事務,沒有提交的事務,在子自治事務中是看不到的。可是在他主事務自己中沒有提交也能看到插入了一條記錄。code
二、當咱們將第二個存儲過程,作點修改,假以下面着色部分兩行,而且提交,咱們運行主事務,看看有什麼反映。blog
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(最後)it
PRAGMA AUTONOMOUS_TRANSACTION;
看下,數據改變狀況能夠發現,咱們的第一條,和子自治的最後commit的一條都插入了,進去。 自治,就是這個意思啦。
![](http://static.javashuo.com/static/loading.gif)
三、在作點修改,以下,直接插入三條記錄,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;
結果以下:class
主事務插入一行以後行數:1 插入三條記錄以前子自治事務行數:0 插入三條記錄以後子自治事務行數:3 運行子自治事務以後,主事務的行數:1
相信到這裏就知道了,主事務,看不到子事務的,commit rollback的操做,即:他們互相獨立。test
由於,咱們在主事務中,沒有寫commit,你能夠在運行過程當中調試的時候,手動 按下rollback的按鈕,你能夠看到。後臺把子事務的事務處理提交到了數據庫。
總之:相互獨立,不影響,不干擾,看到的數據也是。
分享共進步!
謝謝閱讀!