當前位置:開發者網絡 >> 技術教程 >> 數據庫專欄 >> 其他相關 >> 內容
精彩推薦
分類最新教程
分類熱點教程
    
(interbase之八) interbase的事務處理
作者:未知
日期:2005-04-29
人氣:
投稿:(轉貼)
來源:未知
字體:
收藏:加入瀏覽器收藏
以下正文:

 (interbase之八) interbase的事務處理 

原作 kylixyqh
-----------------------------------------------
      如果你使用過sybase,ms sql server等關係數據庫,你可能對interbase的事務處理感到奇怪。在interbase中如何進行事務處理呢?如何啟動、提交、回退事務呢?interbase中進行事務處理的語句在哪裡呢?特別在編寫和使用存儲過程、觸發器時,不少人存在這種疑惑。實際上,只要搞明白最關鍵的一點,interbase的事務處理就徹悟了,那就是:interbase不支持內嵌事務處理,根本不存在進行事務處理的語句。這也就是為什麼interbase的sql語言不和其他關係數據庫一樣稱作T-SQL。你不可能像sybase等數據庫一樣,在存儲過程和觸發器中通過begin trans(action),commit trans(action),rollback trans(action)等語句進行事務處理。那麼intebase的事務如何運作呢?在interbase中,所有的事務,不論是顯式的還是隱式的,全部通過客戶端啟動,並根據客戶端操作的情況要麼提交要麼回退。當客戶端發起一個sql請求時,同時也啟動一個事務,如果該語句執行成功,interbase就自動提交該事務;否則,如果該語句執行失敗,interbase就回退事務。從這個意義上講,能不能認為interbase的事務都是客戶端事務而不是服務器端事務呢?否!一定要搞清楚,interbase的事務必然而且肯定是在服務器端由interbase數據庫引擎操作管理的,只是interbase事務的啟動是在客戶端發起,而不是在服務器端發起,這是最本質的一點。一個sql語句的執行可能會嵌套調用或引發其他sql語句的執行,這些sql語句也會啟動各自的事務,我們把第一個被啟動的事務稱為根事務,其他事務稱作子事務。這樣,根事務、子事務就形成了一個具有嵌套結構的事務鏈。只有當該事務鏈中所有環節對應的操作全部執行成功(不能有任何一個失敗),interbase才提交事務;相反,只要事務鏈中任意一個環節對應的操作失敗(儘管其它環節操作成功),interbase就回退全部事務。interbase決不會進行部分事務的提交。這就是interbase的事務運作機理,也即interbase強調的atomic transaction。
明白了這一點,讓我們看一下interbase的存儲過程和觸發器的事務問題。存儲過程是由客戶端調用執行的,客戶端執行存儲過程的同時也啟動了一個事務,不妨假定這個事務就是該存儲過程的根事務,存儲過程中的任何一條sql語句都會啟動相應的子事務,這些子事務嵌套在上述根事務中,形成一個事務鏈。根據前面的說明,不論是根事務對應的調用操作,還是子事務對應的存儲過程中的操作,只要有一個操作失敗,interbase就回退事務鏈中全部的事務,從而不對數據庫造成任何實質的更改;只有當所有的操作全部執行成功,interbase才會提交事務鏈中所有的事務,對數據庫進行實質性更改。
觸發器是由於客戶端執行插入、更改、刪除等操作時激發的。客戶端執行插入、更改、刪除等操作時肯定會啟動相應的事務,不妨假定為根事務,而由它們激發的觸發器中的sql語句操作啟動的子事務被嵌套上述的根事務中,從而也形成一個事務鏈。如果觸發器中有某個語句執行失敗,interbase就會回退所有事務,觸發器的操作不會生效,激發它的插入或者更改或者刪除等動作也被回退;同樣,如果插入、更改或者刪除等操作失敗,整個事物也被回退,觸發器同樣也不起作用。只有當所有的操作全部執行成功,插入、更改、刪除操作才生效,觸發器也才起作用。
明白了上面的解釋,你可能也就理解了在存儲過程和觸發器中沒有事務操作語句的原因了。實質上,與其它數據庫相比,interbase極大的簡化了存儲過程、觸發器的編寫。
順便說明一下,如果你使用delphi的IBX編寫客戶端,你可以通過TIBTransaction的starttransaction,commit(或commitretaining),rollback(或rollbackretaining)選擇合適的時機明確地啟動、提交、回退事務。但是,一定要遵守一個原則,即:事務期間要盡可能地短。

相關文章: