PowerBuilder應用開發系列講座(1) (轉)

worldblog發表於2007-12-06
PowerBuilder應用開發系列講座(1) (轉)[@more@]

PowerBuilder應用開發系列講座(1)
張健姿

  在中,所謂事務是指一組邏輯操作單元,使資料從一種狀態變換到另一種狀態。為確保資料庫中資料的一致性,資料的操縱應當是離散的成組的邏輯單元:當它全部完成時,資料的一致性可以保持,而當這個單元中的一部分操作失敗,整個事務應全部視為錯誤,所有從起始點以後的操作應全部回退到開始狀態。

   對事務的操作是這樣進行的:先定義開始一個事務,然後對資料作修改操作,這時如 果提交(COMMIT),這些修改就永久地儲存下來,如果回退(ROLLBACK),資料庫管理將放棄 您所作的所有修改而回到開始事務時的狀態。此外有些資料庫支援事務的“點(savepoint)”這一概念:即在一個事務程式中任意一點您都可以進行當前狀態的儲存,回退時只是回到你所設定 的儲存點,而不必退回全部的事務。如果您的事務可以分成幾組對資料庫的修改,那就可以設定 多個儲存點,根據需要您可以回退到任意一個儲存點,而不使所有事務的修改資料全部丟失。

  正確地管理事務可以保證資料的完整性,當您所做的工作全部完成和得到確認之前,沒有任何資料物理地寫進資料庫。讓我們來看這樣一個例項,我們有這樣一個銀行應用系統,前臺使用者作出將儲戶甲的一百元存款劃歸儲戶乙帳下的操作;在後臺的資料庫中,這兩個客戶的記錄分儲在兩張表中,當使用者在螢幕上作出如上操作時,在後臺需要對兩張表進行修改。如果在資料庫中對甲存款餘款作減去一百元修改後,對乙使用者加一百元的操作修改卻失敗時,前一張表也必須回到修改前的狀態,否則資料庫的內容不統一,甲儲戶白白損失一百元,資訊必然是不正確的。因此進行事務管理是必須的。

  傳統地,我們認為一個事務包括了對一個或多個表的修改,而隨著分散式資料庫和資料倉儲的發展,事務可能包括了對一個或多個資料庫的修改。在上例中甲乙兩使用者就可能是異地使用者,資訊分儲在不同地域的不同資料庫中,上述的一個事務就涉及到了對不同資料庫的操作。

PowerBuilder中的事務管理
  作為資料庫的前臺開發工具Power-Builder支援事務管理的操作。在Power-Builder中有一種稱作事務(transaction)的,這個物件是PowerBuilder應用與資料庫的通訊區域。PowerBuilder在應用開始時建立一個全域性的事務物件CA。由於大多數的應用只用到一個資料庫,所以一般開發者主要也只用SQLCA作為與唯一資料庫連線的事務物件。

  PowerScript中常用的事務管理的語句有四個:COMMIT,ROLLBACK,CONNECT,DINNECT。

  當您需要應用與資料庫建立連線時使用CONNECT這一操作命令,取消連線時DISCONNECT,這兩個命令一般分別用在應用的開始和結束,也就是Appli-cation的Open和Close事件中。

  當一個事務的資料庫修改都成功地完成後,修改須提交給資料庫,COM-MIT語句是一箇舊事務結束和一個新事務開始的界線。在修改被提交前,資料庫的資料並沒有被真正地修改,這些修改被保留在某個工作區,只有作修改的使用者才能看到這些被修改後的值,提交之後,則所有的使用者就都可以看到新值了。

  在事務的程式中發生某些錯誤,或者在操作中出於種種原因打算中止事務,須用ROLLBACK命令回退事務,如果已作的操作不用ROLLBACK命令取消,這些操作必將錯誤地作為下一個事務的一部分而導致資料庫的混亂。

  如果您使用的是多視窗的應用,卻只用一個事務物件,就應格外注意ROLL-BACK和COMMIT會影響事務的邏輯一致性。在某個視窗執行的這兩個指令會使其他視窗應用中所進行到一半的工作提交或回退。

  在多使用者系統中,修改和提交的時間越接近,提交成功的可能性就越高。因為一個事務中所有的SQL語句全部執行成功而提交卻失敗是完全可能發生的,例如在您的事務過程中,另一個使用者修改了資料並提交,這很可能使您作出的修改無效,這時COMMIT將失敗,您必須回退這一事務的全部。

事務物件的AutoCommit屬性
  事務物件有一個AutoCom-mit的屬性可以使開發者簡化對事務管理的操作,這一布林型的屬性可以用TRUE或FALSE來對其賦值。當其為真時,PowerBuilder不透過其他額外的互動就將您的SQL語句傳輸給後臺資料庫,而且執行完畢自動提交。

  當然,您可以設定AutoCommit屬性為假(預設值),使用COMMIT或ROLLBACK這樣的關鍵詞提交或回退事務。在大多數應用中,一部分的資料庫操作是要成組提交的,而另一些則不用。因此我們可以利用AutoCommit的特性來確定事務的起點,當我們把AutoCommit的屬性設為False時,系統設定此時為事務的起點。當AutoCommit設為真時,系統自動消取這一事務。因此你可以先把AutoCommit設為真,當您需要開始一個事務時,將其置為false,此刻即為事務起始點。

  PowerBuilder內部這種事務管理的最大優點是方便。您不去考慮整個事務,而只需把您所作的修改提交或滾回即可。但是方便與可控性總是矛盾的,在Power-Builder中沒有儲存點和巢狀事務管理的機制,即使您所使用的資料庫支援這些特性,在PowerBuilder中卻無法得以體現。不過在普通的應用中,儲存點和巢狀事務管理並不是必須的,一般的事務管理足以夠用。

用資料庫的事務管理指令實現完全控制
  上述的事務管理方式儘管簡單方便,但是在某些應用中,我們也的確需要利用所用的資料庫系統的巢狀事務和儲存點的特性,而PowerBuilder內部的事務管理沒有提供這樣的功能,您必須自己設計。

  自己進行事務管理的方式是直接使用資料庫本身的事務指令。當您使用自己的管理方式時,就應使Power-Builder停止管理事務,即設定Auto-Commit為TRUE,系統內部就不會自動建構事務處理的命令了。實現人工事務管理的方式是採用EXECUTEIMMEDI ATE這條PowerBuilder指令來執行任意的資料庫操作。你所需做的是將資料庫指令編輯成一個字串,您可以執行任何的資料定義語句如建表、建主鍵、等,例如您可以用 EXECUTE IMMEDIATE BEGIN TRANSACTION trans-name。這樣的指令開始一個事務。採用這種方法,只要您所用的資料庫支援巢狀事務和儲存點等事務管理,我們透過PowerBuilder開發出的應用也就同樣可以實現。

  在PowerBuilder中提供的事務管理的方法是多種多樣的,只要您靈活運用,就一定能設計出優秀的資料庫應用來。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988818/,如需轉載,請註明出處,否則將追究法律責任。

相關文章