Oracle自治事務實際用例

以下,新建兩個存儲過程:數據庫

在主自治事務中,咱們插入一條記錄,而後在自治事務中,查看錶中行數,而後嘗試插入三條記錄,查看行數,最後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的一條都插入了,進去。 自治,就是這個意思啦。



三、在作點修改,以下,直接插入三條記錄,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的按鈕,你能夠看到。後臺把子事務的事務處理提交到了數據庫。

 

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

分享共進步!

謝謝閱讀!

相關文章
相關標籤/搜索