一、樂觀鎖的介紹
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了黃州免費(fèi)建站歡迎大家使用!
樂觀鎖是相對(duì)悲觀鎖而言,也是為了避免數(shù)據(jù)庫幻讀、業(yè)務(wù)處理時(shí)間過長等原因引起數(shù)據(jù)處理錯(cuò)誤的一種機(jī)制,但樂觀鎖不會(huì)刻意使用數(shù)據(jù)庫本身的鎖機(jī)制,而是依據(jù)數(shù)據(jù)本身來保證數(shù)據(jù)的正確性。
樂觀鎖的機(jī)制:對(duì)每條數(shù)據(jù)庫加上版本號(hào)或時(shí)間撮,在每次對(duì)數(shù)據(jù)進(jìn)行操作(尤其是修改操作)時(shí),總會(huì)帶上版本號(hào)獲取數(shù)據(jù)同時(shí)更改后修改版本號(hào)。
二、樂觀鎖的代碼示例
2.1 創(chuàng)建一張表
create table em_oplock
(
id VARCHAR(100) not null,
value VARCHAR(100),
version int(10),
PRIMARY key(id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
2.2 插入一條數(shù)據(jù)
INSERT into em_oplock values('1','1',1);
2.3 修改數(shù)據(jù)
update em_oplock set value='2',version=version+1 where id = 1 and version = 1;
三、樂觀鎖的業(yè)務(wù)使用示例
事務(wù)1
事務(wù)2
說明:
當(dāng)兩個(gè)用戶同時(shí)操作ID為1的數(shù)據(jù)或一個(gè)用戶未處理完另一個(gè)用戶也對(duì)此數(shù)據(jù)操作時(shí),兩個(gè)用戶獲取數(shù)據(jù)做了一系列的業(yè)務(wù)處理后都認(rèn)為自己的數(shù)據(jù)判斷是正確的,于是都對(duì)同一條數(shù)據(jù)進(jìn)行修改提交。如果我們不做版本控制的話,后處理的用戶將覆蓋前面用戶的數(shù)據(jù)。如果我們加上版本控制的話,當(dāng)用戶1處理成功后,用戶2將一條數(shù)據(jù)都不會(huì)處理。
四、悲觀鎖的業(yè)務(wù)使用示例
事務(wù)1:成功鎖定數(shù)據(jù)
事務(wù)2:等待鎖的釋放
事務(wù)1:操作鎖定數(shù)據(jù)并提交,同時(shí)釋放鎖定數(shù)據(jù)
事務(wù)2:獲取數(shù)據(jù)鎖(最新數(shù)據(jù))
說明:
為了對(duì)數(shù)據(jù)處理的正確性,在操作數(shù)據(jù)前先對(duì)數(shù)據(jù)進(jìn)行鎖定(for update)。利用數(shù)據(jù)庫本身的排它鎖機(jī)制,保證了數(shù)據(jù)只能一個(gè)用戶一個(gè)用戶的處理。
五、樂觀鎖與悲觀鎖的比較
5.1 樂觀鎖需要增加額外的字段來記錄版本號(hào),增加了數(shù)據(jù)庫設(shè)計(jì)復(fù)雜度。(樂觀鎖的劣勢)
5.2 樂觀鎖需要每個(gè)修改的地方同時(shí)更新版本號(hào),增加了開發(fā)的成本。(樂觀鎖的劣勢)
5.3 當(dāng)并發(fā)量大或業(yè)務(wù)時(shí)間處理比較長時(shí),就會(huì)造成數(shù)據(jù)庫鎖長時(shí)間等待,限制并發(fā)量和快速消耗數(shù)據(jù)庫資源。(悲觀鎖的劣勢)
5.4 悲觀鎖操作時(shí),需要對(duì)數(shù)據(jù)庫的鎖機(jī)制有一定程度的理解才行。否則,容易造成表鎖或死鎖。(悲觀鎖的劣勢)
六、樂觀鎖與悲觀鎖的選擇
不論是悲觀鎖還是樂觀鎖,都是為實(shí)際業(yè)務(wù)服務(wù)的,都是為了保證數(shù)據(jù)的正確性。選擇樂觀鎖還是悲觀鎖需要根據(jù)具體的業(yè)務(wù)場景、數(shù)據(jù)庫設(shè)計(jì)、開發(fā)成本等因素進(jìn)行權(quán)衡。如果此業(yè)務(wù)涉及的面比較多、開發(fā)人員比較多等,建議用悲觀鎖。如果此業(yè)務(wù)比較單一或數(shù)據(jù)庫操作的地方比較少、并發(fā)量要求很高等情況下,建議用樂觀鎖。
如果我們把業(yè)務(wù)設(shè)計(jì)得更合理一點(diǎn),數(shù)據(jù)為設(shè)計(jì)更好一點(diǎn),也許不需要這么麻煩!
網(wǎng)頁標(biāo)題:數(shù)據(jù)庫鎖之樂觀鎖
文章位置:http://www.chinadenli.net/article36/piihsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站導(dǎo)航、域名注冊(cè)、品牌網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)