Oracle自治事務實際用例


如下,新建兩個存儲過程:

在主自治事務中,我們插入一條記錄,然后在自治事務中,查看表中行數,然后嘗試插入三條記錄,查看行數,最后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的按鈕,你可以看到。后台把子事務的事務處理提交到了數據庫。

 

總之:相互獨立,不影響,不干擾,看到的數據也是。

分享共進步!

謝謝閱讀!

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM