Mysql之乐观锁悲观锁:乐观锁检查数据状态 悲观锁更新时锁定数据
1.問(wèn)題來(lái)源
就是一數(shù)據(jù)表的數(shù)據(jù)? 在兩個(gè)人同時(shí)修改的時(shí)候? 會(huì)出現(xiàn)混亂?
例子:如一個(gè)字段記錄status=1 表示可以下單? 貨品只有1個(gè)的時(shí)候? ? a下單的同時(shí)b也下單 ; a有修改status的機(jī)會(huì)? b也有修改的機(jī)會(huì);但是a下單成功? b下單未知? ?這就會(huì)出現(xiàn)矛盾 與現(xiàn)實(shí)的不想符合!
2.悲觀鎖
悲觀鎖是對(duì)數(shù)據(jù)被的修改持悲觀態(tài)度(認(rèn)為數(shù)據(jù)在被修改的時(shí)候一定會(huì)存在并發(fā)問(wèn)題),因此在整個(gè)數(shù)據(jù)處理過(guò)程中將數(shù)據(jù)鎖定。悲觀鎖的實(shí)現(xiàn),往往依靠數(shù)據(jù)庫(kù)提供的鎖機(jī)制(也只有數(shù)據(jù)庫(kù)層提供的鎖機(jī)制才能真正保證數(shù)據(jù)訪問(wèn)的排他性,否則,即使在應(yīng)用層中實(shí)現(xiàn)了加鎖機(jī)制,也無(wú)法保證外部系統(tǒng)不會(huì)修改數(shù)據(jù))。
(翻譯:就是悲觀鎖認(rèn)為所有的數(shù)據(jù)表操作都會(huì)有并發(fā)問(wèn)題? 所以依靠自身的鎖機(jī)制來(lái)一個(gè)鎖定一次處理完好之后 再進(jìn)行下一次的數(shù)據(jù)操作)
3.悲觀鎖的方法
在上面的場(chǎng)景中,商品信息從查詢出來(lái)到修改,中間有一個(gè)處理訂單的過(guò)程,使用悲觀鎖的原理就是,當(dāng)我們?cè)诓樵兂鰃oods信息后就把當(dāng)前的數(shù)據(jù)鎖定,直到我們修改完畢后再解鎖。那么在這個(gè)過(guò)程中,因?yàn)間oods被鎖定了,就不會(huì)出現(xiàn)有第三者來(lái)對(duì)其進(jìn)行修改了。要使用悲觀鎖,我們必須關(guān)閉mysql數(shù)據(jù)庫(kù)的自動(dòng)提交屬性。
set autocommit=0; //設(shè)置完autocommit后,我們就可以執(zhí)行我們的正常業(yè)務(wù)了。具體如下: //0.開(kāi)始事務(wù) begin;/begin work;/start transaction; (三者選一就可以) //1.查詢出商品信息 select status from t_goods where id=1 for update; //2.根據(jù)商品信息生成訂單 insert into t_orders (id,goods_id) values (null,1); //3.修改商品status為2 update t_goods set status=2; //4.提交事務(wù) commit;/commit work;使用了select…for update的方式,這樣就通過(guò)數(shù)據(jù)庫(kù)實(shí)現(xiàn)了悲觀鎖
SELECT ... LOCK IN SHARE MODE
SELECT ... FOR UPDATE
而主要的不同在于LOCK IN SHARE MODE 在有一方事務(wù)要Update 同一個(gè)表單時(shí)很容易造成死鎖。如果SELECT 后面若要UPDATE 同一個(gè)表單,最好使用SELECT ... UPDATE
4.Row Lock與Table Lock
默認(rèn)Row Lock? 只要指定id 就是行鎖? 沒(méi)有指定就是表鎖
5.鎖定分析
5.1 明確指定主鍵,并且有此數(shù)據(jù),row lock
5.2 明確指定主鍵,若查無(wú)此數(shù)據(jù),無(wú)lock
5.3?無(wú)主鍵,table lock
5.4?主鍵不明確,table lock
5.5?明確指定索引,并且有此數(shù)據(jù),row lock
5.6?明確指定索引,若查無(wú)此數(shù)據(jù),無(wú)lock
6.樂(lè)觀鎖
悲觀鎖:在讀取數(shù)據(jù)時(shí)鎖住那幾行,其他對(duì)這幾行的更新需要等到悲觀鎖結(jié)束時(shí)才能繼續(xù) 。
樂(lè)觀所:讀取數(shù)據(jù)時(shí)不鎖,更新時(shí)檢查是否數(shù)據(jù)已經(jīng)被更新過(guò)(添加where條件即可判斷是否更新了!),如果是則取消當(dāng)前更新,一般在悲觀鎖的等待時(shí)間過(guò)長(zhǎng)而不能接受時(shí)我們才會(huì)選擇樂(lè)觀鎖? 適用于高并發(fā)的情況
?
總結(jié)
以上是生活随笔為你收集整理的Mysql之乐观锁悲观锁:乐观锁检查数据状态 悲观锁更新时锁定数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 冒险岛代码查询079(冒险岛代码查询)
- 下一篇: 快穿主攻渣攻文(快穿主攻渣攻肉多)