pb之CommitOnDisconnect

       今天看到一段代碼對transaction object的DBParm賦值CommitOnDisconnect='No',本身這段代碼沒問題,pb transaction object 執行disconnect 命令斷開與數據庫連接時,如果不進行上面的賦值,pb會默認提交掉當前未提交的transaction。

        但是看了這段代碼的註釋,立馬傻眼了,註釋是這樣寫的:

//==============================================================================
// 當一個較長的事務執行了前面幾步尚未Commit時發生數據庫連接斷開(非法操作、斷線、死機等)
// 此時會發生已執行的SQL不能回滾,從而導致數據錯誤(如庫存已加但入庫單卻未打上入庫標誌)
// 爲防止此類錯誤發生應設置爲:數據庫連接斷開後不自動提交,即CommitOnDisconnect='No'
// Added By XXX 2002.09.10
//==============================================================================

       從這段註釋可以看出,作者的意思是,事務裏面的sql語句集執行了一部分,出現非法操作、斷線、死機等情況時,如果不設置CommitOnDisconnect='No',會出現執行了的sql語句commit,未執行的sql語句rollback的情況。實時真是如此嗎?

        我們在pb幫助文檔中,可以找到這麼一句話:

         Automatic COMMIT when disconnected  When a transaction is disconnected, PowerBuilder issues a COMMIT statement by default.

        翻譯過來是說,當transaction disconnected的時候,pb默認執行了commit命令。此處的disconnected 並不是我們廣義上說的斷開連接,他不包含網絡斷開,系統崩潰等特殊情況。這裏說的disconnected 是執行disconnected命令。

       自己多想想也能明白的,網絡都斷開了,數據庫服務端怎麼可能收到pb客戶端發送的commit命令,有的人說了,這個是作爲連接參數傳給數據庫的,數據庫會知道這個參數,當網絡斷開時,數據庫端自動提交,我只能說這些人想得太天真了,pb幾乎可以連接所有關係型數據庫,pb有什麼能力要求所有關係型數據庫廠商按照他們傳過來的參數要求,當網絡斷開時,執行commit或者rollback。

       有的人又要反駁了,說pl/sql執行一句sql命令,不手動commit,退出pl/sql會自動commit,這難道不是數據庫服務端判斷的?這個還真不是數據庫服務端判斷的,pl/sql工具菜單->首選項->oracle->連接->註銷(有打開的事務),從這裏可以看到,這裏默認設置了commit。

       所以說當disconnected時,到底要不要commit是客戶端決定的,如果需要commit,客戶端就需要默認發送一個commit命令。這裏說的disconnected是正常的系統斷開,並不包含網絡斷開,系統崩潰的異常情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章