不要使用SELECT FOR UPDATE

2022-05-05    分類: 網(wǎng)站建設(shè)

在SELECT語(yǔ)句中聲明游標(biāo)時(shí),不要使用FORUPDATE從句。適用情形:無(wú)論何時(shí)都適用。審查關(guān)于游標(biāo)的代碼,質(zhì)疑每個(gè)SELECTFORUPDATE語(yǔ)向。使用FORUPDATE從句會(huì)鎖定行,從而降低事務(wù)處理速度。要點(diǎn):游標(biāo)是一種強(qiáng)大的結(jié)構(gòu),使用得當(dāng),能夠使編程更快更容易,同時(shí)還能加速事務(wù)處理。但FORUPDATE游標(biāo)可能會(huì)長(zhǎng)期鎖定數(shù)據(jù),降低事務(wù)處理速度。參考數(shù)據(jù)庫(kù)文檔,看是否需要使用FORREADONIY從句,最小化鎖的數(shù)量。

如果使用得當(dāng),游標(biāo)是非常強(qiáng)大的數(shù)據(jù)庫(kù)控制結(jié)構(gòu),利用游標(biāo)可以遍歷和處理游標(biāo)査詢(或操作)定義的結(jié)果集中的數(shù)據(jù)。在要指定一個(gè)數(shù)據(jù)集進(jìn)行遍歷或遍歷處理數(shù)據(jù)集中的行時(shí),游標(biāo)非常有用。數(shù)據(jù)集中的數(shù)據(jù)項(xiàng)可以更新、刪除、修改或讀取,也可以被其他進(jìn)程?hào)丝础S螛?biāo)的真正強(qiáng)大之處在于可以作為程序設(shè)計(jì)語(yǔ)言的擴(kuò)展,因?yàn)樵S多過(guò)程和面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言都沒(méi)有提供內(nèi)置的管理關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)集的功能。在高速事務(wù)處理系統(tǒng)中,在SEL,ECP游標(biāo)中使用FORUPDATE從句可能造成問(wèn)題,甚至造成死鎖。
在許多數(shù)據(jù)庫(kù)中,一旦打開(kāi)了具有FORUPDATE從句的游標(biāo),那么該語(yǔ)句查詢到的行都會(huì)被鎖住,直到會(huì)話中執(zhí)行到了提交或回退語(yǔ)句為止。COMMIT語(yǔ)句會(huì)保存修改,ROLLBACK語(yǔ)句會(huì)取消所有的修改。執(zhí)行到這兩個(gè)語(yǔ)句中的任何一個(gè),與數(shù)據(jù)庫(kù)中的行相關(guān)的鎖都會(huì)被釋放掉。此外,執(zhí)行了提交或回退語(yǔ)句后,你就會(huì)失去在游標(biāo)中的位置,不能再?gòu)挠螛?biāo)中提取記錄了。
暫停一下,你能發(fā)現(xiàn)游標(biāo)SELECTORUPDAI8E至少可能會(huì)造成兩個(gè)問(wèn)題嗎?第一個(gè)問(wèn)題是,游標(biāo)會(huì)在執(zhí)行操作時(shí)一直保留數(shù)據(jù)庫(kù)行的鎖。在許多情況下,這樣可能都是有用的,甚至在少數(shù)情況下,這樣做是不可避免的,或者是好方案。但是,在執(zhí)行某些操作時(shí),這些鎖會(huì)使其他事務(wù)一直阻塞或等待。如果這些操作很復(fù)雜或需要花費(fèi)一些時(shí)間,那么就會(huì)堆起許多待處理的事務(wù)。如果恰好這些事務(wù)是游標(biāo)執(zhí)行SELECTFORUPDATE操作要執(zhí)行的,那么我們可能就會(huì)創(chuàng)建了一個(gè)等待隊(duì)列,而隊(duì)列的處理時(shí)間是用戶不能接受的。在Web環(huán)境中,讓缺乏耐心的用戶等待漫長(zhǎng)的響應(yīng)會(huì)造成他們發(fā)起更多的請(qǐng)求,而這后來(lái)的請(qǐng)求有可能會(huì)完成得更快。結(jié)果是災(zāi)難性的,我們的系統(tǒng)會(huì)停機(jī),因?yàn)榇幚淼恼?qǐng)求堆在數(shù)據(jù)庫(kù)端,最終會(huì)造成Web服務(wù)器占用了所有TCP端口,從而停止響應(yīng)用戶。
第二個(gè)問(wèn)題前面提示過(guò),是第一個(gè)問(wèn)題造成的。必須等到之前的鎖清除了,后面的游標(biāo)才能對(duì)當(dāng)前鎖住的一行或多行加鎖。注意,這些鎖可能不是游標(biāo)加的,它可以是用戶加的顯式鎖,也可以是RDBMS加加的隱式鎖。數(shù)據(jù)庫(kù)中的鎖越多,事務(wù)堆積的可能性越大,雖然有些鎖是必需的。長(zhǎng)期保留的鎖會(huì)造成對(duì)經(jīng)常請(qǐng)求的數(shù)據(jù)的響應(yīng)時(shí)間變慢。有些數(shù)據(jù)庫(kù),如Oracle,有選用的天鍵子NOWA可以把控制權(quán)釋放
給進(jìn)程,用于執(zhí)行其他的工作或在再次取得鎖之前等待。但是,如果游標(biāo)必須處理某些同時(shí)發(fā)生的客戶請(qǐng)求,那么對(duì)用戶來(lái)說(shuō),最終結(jié)果是一樣的,就是客戶端請(qǐng)求都需要等待很久才能得到響應(yīng)。
注意,有些網(wǎng)站制作數(shù)據(jù)庫(kù)默認(rèn)會(huì)在游標(biāo)中使用FORUPDATE從句。事實(shí)上,ANSI的SQL標(biāo)準(zhǔn)指示,任何游標(biāo)都要默認(rèn)使用FORUPDATE從句,除非它在DECLARE語(yǔ)句中使用了FORREADONLY從句。開(kāi)發(fā)人員和DBA應(yīng)該參考他們的數(shù)據(jù)庫(kù)文檔,看看如何開(kāi)發(fā)鎖最少的游標(biāo)。

分享標(biāo)題:不要使用SELECT FOR UPDATE
URL鏈接:http://www.bm7419.com/news48/150548.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、網(wǎng)站收錄面包屑導(dǎo)航、自適應(yīng)網(wǎng)站、網(wǎng)站建設(shè)、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司