在SELECT語句中聲明游標時,不要使用FORUPDATE從句。適用情形:無論何時都適用。審查關(guān)于游標的代碼,質(zhì)疑每個SELECTFORUPDATE語向。使用FORUPDATE從句會鎖定行,從而降低事務(wù)處理速度。要點:游標是一種強大的結(jié)構(gòu),使用得當,能夠使編程更快更容易,同時還能加速事務(wù)處理。但FORUPDATE游標可能會長期鎖定數(shù)據(jù),降低事務(wù)處理速度。參考數(shù)據(jù)庫文檔,看是否需要使用FORREADONIY從句,最小化鎖的數(shù)量。
如果使用得當,游標是非常強大的數(shù)據(jù)庫控制結(jié)構(gòu),利用游標可以遍歷和處理游標査詢(或操作)定義的結(jié)果集中的數(shù)據(jù)。在要指定一個數(shù)據(jù)集進行遍歷或遍歷處理數(shù)據(jù)集中的行時,游標非常有用。數(shù)據(jù)集中的數(shù)據(jù)項可以更新、刪除、修改或讀取,也可以被其他進程査看。游標的真正強大之處在于可以作為程序設(shè)計語言的擴展,因為許多過程和面向?qū)ο蟮某绦蛟O(shè)計語言都沒有提供內(nèi)置的管理關(guān)系數(shù)據(jù)庫的數(shù)據(jù)集的功能。在高速事務(wù)處理系統(tǒng)中,在SEL,ECP游標中使用FORUPDATE從句可能造成問題,甚至造成死鎖。
在許多數(shù)據(jù)庫中,一旦打開了具有FORUPDATE從句的游標,那么該語句查詢到的行都會被鎖住,直到會話中執(zhí)行到了提交或回退語句為止。COMMIT語句會保存修改,ROLLBACK語句會取消所有的修改。執(zhí)行到這兩個語句中的任何一個,與數(shù)據(jù)庫中的行相關(guān)的鎖都會被釋放掉。此外,執(zhí)行了提交或回退語句后,你就會失去在游標中的位置,不能再從游標中提取記錄了。
暫停一下,你能發(fā)現(xiàn)游標SELECTORUPDAI8E至少可能會造成兩個問題嗎?第一個問題是,游標會在執(zhí)行操作時一直保留數(shù)據(jù)庫行的鎖。在許多情況下,這樣可能都是有用的,甚至在少數(shù)情況下,這樣做是不可避免的,或者是好方案。但是,在執(zhí)行某些操作時,這些鎖會使其他事務(wù)一直阻塞或等待。如果這些操作很復雜或需要花費一些時間,那么就會堆起許多待處理的事務(wù)。如果恰好這些事務(wù)是游標執(zhí)行SELECTFORUPDATE操作要執(zhí)行的,那么我們可能就會創(chuàng)建了一個等待隊列,而隊列的處理時間是用戶不能接受的。在Web環(huán)境中,讓缺乏耐心的用戶等待漫長的響應會造成他們發(fā)起更多的請求,而這后來的請求有可能會完成得更快。結(jié)果是災難性的,我們的系統(tǒng)會停機,因為待處理的請求堆在數(shù)據(jù)庫端,最終會造成Web服務(wù)器占用了所有TCP端口,從而停止響應用戶。
第二個問題前面提示過,是第一個問題造成的。必須等到之前的鎖清除了,后面的游標才能對當前鎖住的一行或多行加鎖。注意,這些鎖可能不是游標加的,它可以是用戶加的顯式鎖,也可以是RDBMS加加的隱式鎖。數(shù)據(jù)庫中的鎖越多,事務(wù)堆積的可能性越大,雖然有些鎖是必需的。長期保留的鎖會造成對經(jīng)常請求的數(shù)據(jù)的響應時間變慢。有些數(shù)據(jù)庫,如Oracle,有選用的天鍵子NOWA可以把控制權(quán)釋放
給進程,用于執(zhí)行其他的工作或在再次取得鎖之前等待。但是,如果游標必須處理某些同時發(fā)生的客戶請求,那么對用戶來說,最終結(jié)果是一樣的,就是客戶端請求都需要等待很久才能得到響應。
注意,有些
網(wǎng)站制作數(shù)據(jù)庫默認會在游標中使用FORUPDATE從句。事實上,ANSI的SQL標準指示,任何游標都要默認使用FORUPDATE從句,除非它在DECLARE語句中使用了FORREADONLY從句。開發(fā)人員和DBA應該參考他們的數(shù)據(jù)庫文檔,看看如何開發(fā)鎖最少的游標。
網(wǎng)站欄目:不要使用SELECT FOR UPDATE
分享網(wǎng)址:http://muchs.cn/news/150548.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、響應式網(wǎng)站、手機網(wǎng)站建設(shè)、商城網(wǎng)站、網(wǎng)站內(nèi)鏈、軟件開發(fā)
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源:
創(chuàng)新互聯(lián)