為了保護數據的完整性我們用了很多的方法,比如數據表的主鍵約束、外鍵約束、觸發器等等,我們今天討論的就是在處理數據直接的事務的時候,保存數據的完整性。
比如,我在一個存儲過程中Proc_SaveBill保存一張單據,調用一個函數Func_GenerateCode來生成一個單據的編號,假如我的這個函數是從一個存有最大編號的表中取出的並且把編號加一,大家可能會想象的可能產生的問題,就是如果我在Proc_SaveBill中的保存之前通過Func_GenerateCode得到一個編號,如果後面的保存不成功,怎麼辦是不是就丟了一個編號,因為我調用一次Func_GenerateCode就會增加一個編號的,那麼為了使我們的數據完整不至於丟單,就的使用事務的會滾,現在又有問題了,存儲過程會會滾到函數中嘛!答案是,如果函數中有事務或有commit語句,那麼是會滾不了的,否則可以會滾,因為事務是會滾到上一個committ或rollback之後的所有事物。所以我在這裡說明是為了提醒大家考慮事務的嵌套回滾的一些方法。但是在存儲過程調用存儲過程中,如果被調用的存儲過程執行沒有錯誤,那麼很遺憾是會滾不了的。
為了解決這個問題Oracle中用自治事務來處理上述出現的問題,在存儲過程的is\as後面聲明PRAGMA AUTONOMOUS_TRANSACTION; --自治事務防止嵌套提交,使事務在自己的事務區內提交或回滾不會影響其他的事務。
今天在這裡就說這些,當然這些是比較基礎的,給初學者提個醒!