在select查詢語句的結(jié)尾 加上for update,就可以實(shí)現(xiàn)鎖行,
為和平等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及和平網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、成都網(wǎng)站設(shè)計、和平網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
使用for update of指定數(shù)據(jù)列之后,鎖定的范圍限制在了所在的數(shù)據(jù)表。也就是說,當(dāng)我們使用連接查詢配合of子句的時候,可以實(shí)現(xiàn)有針對性的鎖定。
默認(rèn)情況下的for update語句,效果相當(dāng)于啟動了一個會話級別的事務(wù),在對應(yīng)的數(shù)據(jù)表上加入一個數(shù)據(jù)表級共享鎖。同時,在對應(yīng)的數(shù)據(jù)行中加入獨(dú)占鎖。
泰牛程序員的數(shù)據(jù)庫視頻課程里面有講解
手動加鎖:
表級鎖
lock tables tablename read;//共享鎖
lock tables tablename write;//排它鎖
unlock tables;//解鎖
php直接query就行了。
除了MyIsam,誰還會無聊到顯式加鎖?
InnoDB直接跑事務(wù)默認(rèn)會觸發(fā)隱式鎖,不需要自己lock和unlock。
以前我用過querylist插件抓數(shù)據(jù),服務(wù)器寫和定時器,每天固定時間去運(yùn)行腳本。朝這個方式試試
高并發(fā)下數(shù)據(jù)的更新,應(yīng)該 update table xxx set num = num - 1 的方式,這種方式可以保證數(shù)據(jù)的正確性。
但是會出現(xiàn) num 為負(fù)數(shù)的問題,如果庫存為負(fù)數(shù),顯然是不合理的。
于是,需要將 num 字段設(shè)置為 無符號整型,這樣就不會出現(xiàn)負(fù)數(shù)了,因?yàn)椋绻麥p到負(fù)數(shù),就會更新失敗。
但是這種依然會造成很多無用的更新語句的執(zhí)行,是不合理的。
于是,update table xxx set num = num - 1 where num 0,
這樣當(dāng) num 等于0之后就不會去更新數(shù)據(jù)庫了,減少了很多無用的開銷。
這種方式被稱作“樂觀鎖”
此外,對于搶紅包這種非整數(shù)的操作,我們應(yīng)該轉(zhuǎn)換為整數(shù)的操作。
關(guān)于搶購超賣的控制
一般搶購功能是一個相對于正常售賣系統(tǒng)來說獨(dú)立的子系統(tǒng),這樣既可以防止搶購時的高并發(fā)影響到正常系統(tǒng),
也可以做到針對于搶購業(yè)務(wù)的特殊處理。
在后臺設(shè)計一些功能,可以就昂正常的商品加入到搶購活動中并編輯成為搶購商品,寫入到搶購商品表,當(dāng)然
也可以把搶購商品表寫入redis而不是數(shù)據(jù)表。并且在原商品表寫入一個同樣的商品(id相同,用于訂單查看,
此商品不可購買)
如果是數(shù)據(jù)表,為了控制超賣,需要對表進(jìn)行行鎖,更新的時候帶上 where goods_amount 0。
如果是redis,使用 hincrby 一個負(fù)數(shù)來減庫存,并且 hincrby 會返回改變后的值,再來判斷返回值是否大于0,
因?yàn)閞edis每個命令都是原子性的,這樣不用鎖表就可控制超賣。
一般情況下,MYSQL在更新操作會自動加表鎖。不需要顯式加鎖。除非是數(shù)據(jù)要求嚴(yán)格的邏輯寫順序。
執(zhí)行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執(zhí)行更新操作 (UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖,這個過程并不需要用戶干預(yù),因此,用戶一般不需要直接用LOCK TABLE命令給MyISAM表顯式加鎖。
mysql一般不會死鎖,除非程序有問題。性能優(yōu)先事務(wù)不優(yōu)先的數(shù)據(jù)庫(設(shè)置)不要追求可靠性萬無一失。
網(wǎng)站性能問題主要是數(shù)據(jù)庫量大了以后,查詢掃描硬盤而產(chǎn)生的。其它性能不要太在意。編寫代碼的時候不要堅(jiān)持性能原則,而是堅(jiān)持可用性原則。初學(xué)者編寫代碼通常容易面向性能,但是一個項(xiàng)目的一個頁面幾百、幾千行代碼是很常見的。要面向可用性、可維護(hù)性、可讀性。這是項(xiàng)目原則。你看看java語言。對于網(wǎng)站,除了查詢掃描硬盤而產(chǎn)生的時間延遲,其它是不管的,只要不算有問題就可以。
連接方式是否為永久連接,在訪問量未達(dá)到高并發(fā)之前,還是非永久鏈接更好。非永久連接的資源消耗是不大于永久連接的,因?yàn)閙ysql是把連接權(quán)限緩存的,不會多次掃描硬盤,性能是可執(zhí)行級別的而不是查找數(shù)據(jù)級別的。在訪問量達(dá)到高并發(fā)之后,性能問題的原因是多方面的,多環(huán)節(jié)的,是否為永久連接不是主要原因。
建議用 行鎖+事務(wù)
select * from table where id=‘92’ for update
這樣的話 只有獲得本次數(shù)據(jù)庫鏈接的資源號的 php 程序可以對本條記錄進(jìn)行讀取操作,其他程序如果也有讀取的話會等待鎖定該行的程序執(zhí)行更新后,才能讀取,
另外 貌似對數(shù)據(jù)庫引擎有要求 mysql 的話 innodb 可以這樣玩。
本文標(biāo)題:php數(shù)據(jù)庫行鎖 mysql 鎖行
分享鏈接:http://chinadenli.net/article48/hiheep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、微信小程序、云服務(wù)器、自適應(yīng)網(wǎng)站、網(wǎng)站收錄、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)