新聞中心
在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,數(shù)據(jù)庫是必不可少的一部分,它可以為許多業(yè)務(wù)和應(yīng)用程序提供數(shù)據(jù)存儲(chǔ)和管理的功能。但是,在多個(gè)用戶同時(shí)訪問數(shù)據(jù)庫時(shí),會(huì)面臨著數(shù)據(jù)的并發(fā)性問題,也就是說,多個(gè)用戶同時(shí)試圖讀取或修改同一條數(shù)據(jù)時(shí),可能會(huì)發(fā)生沖突,導(dǎo)致數(shù)據(jù)的不一致性。

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、清遠(yuǎn)網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、清遠(yuǎn)網(wǎng)絡(luò)營銷、清遠(yuǎn)企業(yè)策劃、清遠(yuǎn)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供清遠(yuǎn)建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
數(shù)據(jù)庫系統(tǒng)通過鎖機(jī)制來保證數(shù)據(jù)并發(fā)操作的正確性。其中,行鎖是最常用的一種鎖機(jī)制。行鎖可以保證多個(gè)用戶對(duì)同一表中的不同數(shù)據(jù)行進(jìn)行并發(fā)操作時(shí),彼此不會(huì)產(chǎn)生沖突,從而保證數(shù)據(jù)的完整性和一致性。本文將深入探討如何正確使用行鎖進(jìn)行數(shù)據(jù)操作,以及行鎖的性能優(yōu)化。
一、行鎖的基礎(chǔ)知識(shí)
1. 行鎖的類型
行鎖分為共享鎖(Shared Lock)和排他鎖(Exclusive Lock)兩種類型。
共享鎖(也稱讀鎖):多個(gè)事務(wù)可以同時(shí)持有一個(gè)共享鎖,用于讀取操作。共享鎖和共享鎖是兼容的,即多個(gè)事務(wù)可以同時(shí)持有一個(gè)共享鎖而不干擾彼此。
排他鎖(也稱寫鎖):只允許一個(gè)事務(wù)持有排他鎖,用于寫入操作。排他鎖和排他鎖是互斥的,即在一個(gè)事務(wù)持有排他鎖時(shí),另一個(gè)事務(wù)不能獲得相同的鎖,因?yàn)樗鼈儠?huì)相互干擾。
2. 行鎖的范圍
行鎖是針對(duì)某一行數(shù)據(jù)進(jìn)行鎖定,鎖定的范圍包括“訪問”和“修改”兩個(gè)方面。
訪問鎖:在讀取數(shù)據(jù)時(shí),對(duì)數(shù)據(jù)行進(jìn)行鎖定,防止其他事務(wù)修改該行數(shù)據(jù),但不阻止其他事務(wù)讀取同一行數(shù)據(jù)。
修改鎖:在修改數(shù)據(jù)時(shí),對(duì)數(shù)據(jù)行進(jìn)行鎖定,防止其他事務(wù)訪問和修改該行數(shù)據(jù)。
3. 行鎖的粒度
行鎖的粒度有兩種,分別是表級(jí)別鎖和行級(jí)別鎖。
表級(jí)別鎖:指對(duì)整張表進(jìn)行鎖定,是一種粗粒度的鎖,通常用于執(zhí)行大型批處理等操作,而非在線事務(wù)處理。
行級(jí)別鎖:指對(duì)表中指定行數(shù)據(jù)進(jìn)行鎖定,是一種細(xì)粒度的鎖,通常用于在線事務(wù)處理。
二、正確使用行鎖的實(shí)踐
1. 事務(wù)的基礎(chǔ)知識(shí)
行鎖必須與事務(wù)一起使用,因?yàn)橹挥性谑聞?wù)中才能有效地使用行鎖。事務(wù)是對(duì)數(shù)據(jù)庫操作的邏輯單元,將多個(gè)操作視為一個(gè)整體,并保證這些操作要么全部成功,要么全部失敗。事務(wù)中的操作必須滿足ACID原則,即原子性、一致性、隔離性和持久性。
2. 使用鎖定語句進(jìn)行鎖定
在事務(wù)中,可以使用鎖定語句來鎖定表中的數(shù)據(jù)行。例如,在MySQL中可以使用以下語句鎖定數(shù)據(jù)行:
SELECT * FROM table_name WHERE id = ? FOR UPDATE;
其中,F(xiàn)OR UPDATE是鎖定語句,它會(huì)對(duì)查詢結(jié)果中的數(shù)據(jù)行進(jìn)行排他鎖定,防止其他事務(wù)修改該行數(shù)據(jù)。
3. 使用索引鎖定數(shù)據(jù)行
在事務(wù)中,使用索引可以加快數(shù)據(jù)訪問的速度,也可以較為方便地對(duì)數(shù)據(jù)行進(jìn)行鎖定。例如,在MySQL中可以使用以下語句鎖定索引:
SELECT * FROM table_name WHERE id = ? FOR UPDATE;
其中,使用了索引id進(jìn)行數(shù)據(jù)查找,F(xiàn)OR UPDATE語句同樣是鎖定語句,它會(huì)對(duì)查詢結(jié)果中的數(shù)據(jù)行進(jìn)行排他鎖定,防止其他事務(wù)修改該行數(shù)據(jù)。
4. 鎖定范圍的控制
在事務(wù)中,鎖定范圍的控制也是非常重要的。如果鎖定范圍太小,會(huì)導(dǎo)致并發(fā)操作時(shí)仍然存在沖突的可能;如果鎖定范圍太大,會(huì)導(dǎo)致操作的效率低下,甚至?xí)l(fā)死鎖等問題。
因此,在實(shí)踐中,需要根據(jù)具體情況來控制鎖定范圍。一般來說,如果是對(duì)單個(gè)數(shù)據(jù)行進(jìn)行讀取和修改操作,那么行級(jí)別鎖是更好的選擇;如果是批量操作和大量數(shù)據(jù)查詢,那么表級(jí)別鎖可能更適合。
5. 避免使用強(qiáng)制調(diào)度鎖定語句
強(qiáng)制調(diào)度鎖定語句可以強(qiáng)制一個(gè)事務(wù)中的某些操作等待其他事務(wù)完成,再進(jìn)行自己的操作。但是,這種語句的使用會(huì)導(dǎo)致數(shù)據(jù)庫性能下降,甚至?xí)l(fā)死鎖等問題。
因此,在實(shí)踐中,應(yīng)該盡量避免使用強(qiáng)制調(diào)度鎖定語句。替代方案包括使用樂觀鎖、悲觀鎖等技術(shù),來保證數(shù)據(jù)操作的正確性。
三、行鎖的性能優(yōu)化
1. 使用并發(fā)控制算法
并發(fā)控制算法是一種優(yōu)化鎖機(jī)制,在多用戶并發(fā)訪問時(shí),可以提高數(shù)據(jù)庫的性能和吞吐量。常見的并發(fā)控制算法包括兩階段封鎖(2PL)和多版本并發(fā)控制(MVCC)等。
其中,2PL算法是目前最為主流的并發(fā)控制算法之一,它將事務(wù)分為兩個(gè)階段,之一個(gè)階段是加鎖階段,在這個(gè)階段中,事務(wù)需要獲取它需要訪問的所有數(shù)據(jù)的行級(jí)別鎖;第二個(gè)階段是解鎖階段,在這個(gè)階段中,事務(wù)會(huì)按照相反的順序釋放它所持有的全部鎖。
2. 適當(dāng)控制鎖的請(qǐng)求頻率
在實(shí)際數(shù)據(jù)庫操作中,鎖的請(qǐng)求次數(shù)是非常頻繁的,如果不加以控制,會(huì)導(dǎo)致性能下降、死鎖等問題。因此,適當(dāng)控制鎖的請(qǐng)求頻率是一種有效的性能優(yōu)化方法。
在實(shí)踐中,可以采用兩種方法來控制鎖的請(qǐng)求頻率。一種方法是使用任務(wù)分離技術(shù),將數(shù)據(jù)庫操作分成小的任務(wù),每次僅處理一個(gè)任務(wù),從而降低鎖請(qǐng)求的頻率。另一種方法是使用持久化技術(shù),將數(shù)據(jù)讀入內(nèi)存,使鎖申請(qǐng)和釋放的開銷減少。
3. 合理使用鎖定范圍
鎖定范圍的大小會(huì)直接影響到數(shù)據(jù)庫操作的性能。如果鎖定范圍太小,會(huì)導(dǎo)致其他用戶等待太久;如果鎖定范圍太大,則會(huì)占用大量系統(tǒng)資源,影響整體性能。
因此,在實(shí)踐中,需要根據(jù)具體情況合理使用鎖定范圍。一般來說,對(duì)于單個(gè)數(shù)據(jù)行的讀取和修改操作,行級(jí)別鎖是更好的選擇;對(duì)于大規(guī)模的批處理和數(shù)據(jù)查詢,表級(jí)別鎖可能更適合。
四、結(jié)論
行鎖是數(shù)據(jù)庫中實(shí)現(xiàn)并發(fā)控制的重要手段,它可以保證多用戶對(duì)同一表中的不同數(shù)據(jù)行進(jìn)行并發(fā)操作時(shí),彼此不會(huì)產(chǎn)生沖突,從而保證數(shù)據(jù)的完整性和一致性。在實(shí)踐中,正確使用行鎖是非常重要的,需要結(jié)合事務(wù)、索引、鎖定范圍等多種因素進(jìn)行綜合考慮。同時(shí),優(yōu)化行鎖的性能是一個(gè)不斷追求的過程,需要不斷嘗試新的并發(fā)控制算法、控制鎖的請(qǐng)求頻率、合理使用鎖定范圍等方法。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
MyBatisPlus 分頁插件和數(shù)據(jù)庫行鎖的幾點(diǎn)思考
前段時(shí)間跟蹤 MyBatis 源碼,分析 MyBatis 的分頁查詢結(jié)果后,發(fā)現(xiàn)傳入的 IPage 參數(shù)結(jié)果已經(jīng)包含了查詢數(shù)據(jù)了,以為分頁查詢語句的關(guān)鍵在于之一個(gè)入?yún)⒈仨毷?IPage ,而不需要返回值了呢。
昨天發(fā)現(xiàn)不是這么回事兒,本文再回顧一下 MyBatis 分頁插件的用法及三個(gè)發(fā)現(xiàn):
本文講解答上面三個(gè)問題。簡敗
之一步
,設(shè)置分頁查詢插件。
第二步
,編寫分頁查詢 DAO 方法:
該方法執(zhí)行完成后,查詢數(shù)據(jù)會(huì)存儲(chǔ)到 iPage 參數(shù)中,可以直接獲取方法返回值。值得注意的是,這個(gè)方法必須有返回值。
我最初以為,查詢結(jié)果都存儲(chǔ)到參數(shù)中了,是不是方法定義中可以不用返回值了。昨天編碼時(shí)就隨手寫成這樣了:
結(jié)果,執(zhí)行報(bào) 了 SQL 異常:
納悶了半天,這分頁查詢?cè)趺淳妥兂闪藛螚l查詢了呢?對(duì)比舊項(xiàng)目代碼,還原分頁查詢方法,正常了。
結(jié)論
:MyBatisPlus 分頁方法返回值必須是 IPage ,不能為 void 。
以往頁面的分頁查詢,每頁數(shù)據(jù)都很少,沒有發(fā)現(xiàn)這個(gè)問題。
這次實(shí)現(xiàn)的是一個(gè)批處理任務(wù),一次處理的數(shù)據(jù)要盡量大。 iPage 分頁參數(shù)攔基顫 size 初始設(shè)置為 1000,發(fā)現(xiàn)日志輸出的記錄數(shù)總是 500 條 ,分頁參數(shù)失效了,為何呢?
使用客戶端連接數(shù)據(jù)庫查詢,一次能取 1000 條,而 MyBatisPlus 分頁查詢,這個(gè) 500 條是誰控制的呢?能否修改呢?
答案是
: PaginationInterceptor 限制了單頁條數(shù) 500,如果需要,可以這樣修改:
業(yè)務(wù)要求某個(gè)任務(wù)設(shè)計(jì)成多機(jī)、并行任務(wù),且要保證數(shù)據(jù)一致。Quartz 框架的分布式任務(wù)只能保證任務(wù)被一個(gè)節(jié)點(diǎn)執(zhí)行,不符合需求,Spring Task 倒是可以實(shí)現(xiàn)。
所以問題就變成分布式鎖的設(shè)計(jì)了,參考 Quartz 的集群方案中的鎖機(jī)制,實(shí)現(xiàn)基于數(shù)據(jù)庫行鎖的鎖。
沒測(cè)試基于行鎖的分布式鎖之前,我以為某個(gè)事務(wù)執(zhí)行 select for update 之后,其他事務(wù)再對(duì)相同記錄執(zhí)行該操作的話,應(yīng)該會(huì)報(bào)異常,導(dǎo)致鎖獲取失敗。
測(cè)試發(fā)現(xiàn),某條記錄被鋒搭鎖定之后,交互流程大概是這樣的:
結(jié)論
:數(shù)據(jù)庫記錄的行鎖是排他的,其他事務(wù)會(huì)阻塞等待。
辛丑年臘月二十八,上述就是今年最后一個(gè)工作日的總結(jié)。
收拾收拾,準(zhǔn)備迎接農(nóng)歷新年!
數(shù)據(jù)庫加行鎖的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫加行鎖,深入了解數(shù)據(jù)庫:如何正確使用行鎖進(jìn)行數(shù)據(jù)操作?,MyBatisPlus 分頁插件和數(shù)據(jù)庫行鎖的幾點(diǎn)思考的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡稱香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問快、穩(wěn)定!
當(dāng)前名稱:深入了解數(shù)據(jù)庫:如何正確使用行鎖進(jìn)行數(shù)據(jù)操作?(數(shù)據(jù)庫加行鎖)
標(biāo)題來源:http://fisionsoft.com.cn/article/cdpsios.html


咨詢
建站咨詢
