PowerBuilder程序中的并發控制
摘 要 powerbuilder提供了強大的 數據庫 接口,在并發控制上相對于其他編程工具有些獨到之處,本文分析了pb中并發控制的原理以及基本使用 關鍵詞 并發控制;觸發器 并發能力是指多用戶在同一時間對相同數據同時訪問的能力。一般的關系型數據庫都具有并發控制
摘 要 powerbuilder提供了強大的
數據庫接口,在并發控制上相對于其他
編程工具有些獨到之處,本文分析了pb中并發控制的原理以及基本使用
關鍵詞 并發控制;觸發器
并發能力是指多用戶在同一時間對相同數據同時訪問的能力。一般的關系型
數據庫都具有并發控制的能力,但是這種并發功能也會對數據的一致性帶來危險。試想若有兩個用戶都試圖訪問某個
銀行用戶的記錄并同時要求修改該用戶的存款余額時,情況將會怎樣呢?我們可以對PowerBuilder中的DataWindow進行設置來進行并發控制。所謂并發控制就是指在用戶數據修改的過程中保證該數據不被覆蓋或改變的方式,在下面的例子中我們將看到如何設置DataWindow來控制
開發訪問。
公司的某員工在銀行前臺取款2,000元,銀行出納查詢用戶的存款信息顯示銀行存款余額20,000元;正在這時,另一銀行帳戶轉帳支票支付該帳戶5,000元,機器查詢也得到當前用戶存款20,000元,這時銀行的出納員看到用戶存款超過了取款額,就支付了客戶2,000元并將用戶存款改為18,000元,然后銀行的另一名操作員根據支票,將匯入的5,000元加上,把用戶的余額改為25,000元,那么數據庫管理系統是否可以接受這些修改呢?
在Data
Windows的設計中,我們選擇菜單RowsUpdate…,會出現Specify Update Characteristics的設置窗口,在這個窗口中我們設置Update語句中Where子句的生成,以此來進行
開發控制。在這里有三個選項,我們分別看一看在本例中這三個選項的結果:
(1)Key Columns:生成的Where子句中只比較表中的主鍵列的值與最初查詢時是否相同來確定要修改的記錄。在上述的例子中,轉帳支票的操作將覆蓋出納員做出的修改,這樣銀行損失兩千元。
(2)Key and Updateable Columns:生成的Where子句比較表中主鍵列和可修改列的值與最初查詢時是否相同。在上例中兩次查詢出的結果都是有兩萬余額,當第一個人修改余額時,余額仍是二萬元,所以修改成立,而支票轉帳操作時余額已不是二萬,所以該列不匹配,修改失敗。
(3)Key and Modified Columns:Where子句比較主鍵和將要修改的列,在本例中,結果與Key and Updateable Columns的選擇相同,因為余額已改變,不再與最初的查詢相同,因此仍然不能修改。
讓我們作另外一個假設,我們把銀行后臺作支票轉帳操作改為凍結用戶存款,即把狀態字段的值改為凍結,而且事件發生的次序如下面例子所述,前臺出納的修改能不能成立呢:
(1).Key Columns:Where子句只比較主鍵值,顯然出納員的修改是允許的。
(2).Key and Updateable Columns:生成的Where子句包括比較所有可修改的列,因此出納修改時Statue字段為凍結與出納查詢時的tive不符,修改失敗,同時顯示錯誤信息。
(3).Key and Modified Columns:Where子句的比較包括主鍵和要修改的列,由于本列中修改列仍為20,000元沒有變化,所以出納的修改可以成立。
在本例中,我們可以看到Key and Updateable Columns的選項最嚴格,可以避免出現狀態列發生改變時余額作修改的錯誤,但是這也會禁止我們作一些本當允許的并發修改,如出納修改存款余額,而業務員修改用戶的聯系地址等。因此我們應當根據實際情況,選擇適當的Update設置。
根據我們使用數據庫的不同,我們還有一些其他的控制并發訪問和修改的選擇方案,如對數據加鎖。鎖是一個用戶避免其他用戶對指定行作修改的操作。在結束一個事務如執行commit,rollback,disconnect等語句時自動將鎖釋放。如果您使用的DBMS支持鎖的操作,在Power-Builder的DataWindow設計時,Select語句可在from子句中加上with holdlock:即在data Window的
SQL Window中,在表窗口的標題處點擊右鼠標,彈出菜單的最后一個選項即為Holdlock。選擇該項,生成的
SQL語句將在retrievel()函數執行后將所查詢的數據加鎖,以避免其他用戶的修改訪問,直至commit,rollback等事件發生后解鎖。這種方式帶來的問題是,當用戶查詢完數據后可能離開計算機長時間不用,這段時間內其他用戶均無法修改數據。此外有些DBMS如Sybase等不支持行級鎖,也就是說當你對某一行查詢時更多的行都被上了鎖,這就更增加了并發處理的局限性。另一個值得注意的問題是在多窗口應用中某一個窗口的事務提交將會導致使用一事務中其他數據窗口的查詢行解鎖,這時修改將可能發生錯誤。
某些DBMS系統支持一個稱作"時間戳(timestamp)"的數據項來控制并發性。每張表中都有一個時間戳的數據列,當Insert語句或Update語句對數據行作修改時該列自動被修改為當前時間。當你要作修改時,where子句可檢查時間戳列在查詢時和修改時兩個值是否相符,以此來確保您做出的修改不會覆蓋別人的修改,因此這種確認方式與key and Updateable Columns選項相同。即使兩個用戶對同一行的不同列作修改,后一個修改者也將失敗。在常用的關系型數據庫中Sybase和Microsoft的
SQL Server支持時間戳的使用。而在PowerBuilder中,不管用戶后臺連接何種數據庫,只要表中帶有timestamp的列名且數據類型為datetime,PB將自動忽略Update characteristics的選項,而在where子句中生成主鍵和時間戳列的比較。
如果您所用的數據庫不支持時間戳但支持觸發器,您也可以在表中增加一列整數型的列。當有對表中某種記錄作修改時,該列自動加1。下列使用的是Watcom數據庫,對Shipper表增加Updcnt字段并作兩個觸發器,這樣任何用戶或進程試圖修改某行記錄時,該字段均可發生變化。
對INSERT觸發器的編寫如下:
DROP TRIGGER INS—SHIPPER’
CREATE TRIGGER SHIPPER BEFORE INSERT ON SHIPPER
REFERENCING NEW AS Newvalue
FOR EACH ROW
BEGIN
SET newvalue.UpdCnt=newvalue.UpdCnt+1;
END'
同理可編寫UPDATE觸發器。
在您的PowerBuilder應用之中,除表的主鍵外,必須再加上這一列作為檢測列加入Update語句中的Where子句中,這樣再作Update操作時,后臺數據庫會比較修改時與用戶作Retrieve操作時數據是否相等,以確認是否能作修改。在Data
Windows中在Specify Update Characteris-tics的對話框的右下角的Unique key column(s)中加上Updcnt一項,同時注意where clause中選擇Key columns,這樣PowerBuilder在構造where子句時就會認為Updcnt亦是表的主鍵,而成為檢測項。
當數據窗口的Update函數被調用后,觸發器將修改過記錄中的Updcnt列表為新值,為保證下一次修改能夠有效,您應當立即作Retrieve()以使DataWindow緩沖區中Updcnt的值與數據庫相同。顯然修改后立即查詢的代價要比其他任何一種并發控制的代價要小得多。
原文轉自:http://www.kjueaiud.com
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
|