亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Mysql悲觀鎖和樂觀鎖的使用示例

 更新時(shí)間:2019年11月17日 11:07:41   作者:小星星  
這篇文章主要給大家介紹了關(guān)于Mysql悲觀鎖和樂觀鎖使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

悲觀鎖

悲觀鎖,認(rèn)為數(shù)據(jù)是悲觀的。當(dāng)我們查詢數(shù)據(jù)的時(shí)候加上鎖。防止其他線程篡改,直到對方拿到鎖,才能修改。

比如,有如下的表。status=1表示可以下單,status=2表示不可以下訂單。假如在并發(fā)的過程中有兩個(gè)用戶同時(shí)查到status=1,那么從邏輯上來說都可以去新增訂單,但是會造成商品超賣。

如下例子

CREATE TABLE `goods` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) DEFAULT NULL,
 `status` tinyint(4) DEFAULT NULL,
 `version` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4
INSERT INTO demo.goods (id, name, status, version) VALUES (1, 'test', 1, 1);

session1執(zhí)行

set autocommit=0;
begin;
select *
from goods where id=1 and goods.status=1 for update ;
update goods set status=2 where id=1;

session2執(zhí)行

begin;
select * from goods where id=1 for update;

這時(shí)候session2是阻塞的,因?yàn)殒i還在session1,所以鎖一直在等待。如果session1一直不提交,那么session2將在一定時(shí)間后超時(shí)斷開連接,并且報(bào)

(1205, ‘Lock wait timeout exceeded; try restarting transaction')錯(cuò)誤,

具體的鎖等待時(shí)間可以通過設(shè)置innodb_lock_wait_timeout參數(shù)進(jìn)行控制。

如果此時(shí)在session1中執(zhí)行commit 操作,那么session2將得到查詢結(jié)果,并把鎖交給session2。

我們還可以通過

show status like 'innodb_row_lock_%';

來進(jìn)一步查看鎖信息。

樂觀鎖

樂觀鎖不同于悲觀鎖,樂觀鎖是通過自身的程序?qū)崿F(xiàn),而不是mySql自身實(shí)現(xiàn)。

樂觀鎖查詢的時(shí)不上鎖,只有在更新的時(shí)候檢查版本號。

比如我們查詢到goods表中version 為1 那么在更新這個(gè)表的時(shí)候Sql將是

select * from goods where id=1;
update goods set status=2,version=version+1 where id=1 and version=1;

這里的version是查詢時(shí)候的版本號,每次更改將會導(dǎo)致version+1。如果版本號不匹配更新將不成功。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 使用Kubernetes集群環(huán)境部署MySQL數(shù)據(jù)庫的實(shí)戰(zhàn)記錄

    使用Kubernetes集群環(huán)境部署MySQL數(shù)據(jù)庫的實(shí)戰(zhàn)記錄

    這篇文章主要介紹了使用Kubernetes集群環(huán)境部署MySQL數(shù)據(jù)庫,主要包括編寫 mysql.yaml文件,執(zhí)行如下命令創(chuàng)建,通過相關(guān)命令查看創(chuàng)建結(jié)果,對Kubernetes部署MySQL數(shù)據(jù)庫的過程感興趣的朋友一起看看吧
    2022-05-05
  • mysql 5.7.18 winx64 免安裝 配置方法

    mysql 5.7.18 winx64 免安裝 配置方法

    這篇文章主要介紹了mysql 5.7.18 winx64 免安裝配置方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-04-04
  • MySQL中REPLACE INTO和INSERT INTO的區(qū)別分析

    MySQL中REPLACE INTO和INSERT INTO的區(qū)別分析

    REPLACE的運(yùn)行與INSERT很相似。只有一點(diǎn)例外,假如表中的一個(gè)舊記錄與一個(gè)用于PRIMARY KEY或一個(gè)UNIQUE索引的新記錄具有相同的值,則在新記錄被插入之前,舊記錄被刪除。
    2011-07-07
  • mysql exists與not exists實(shí)例詳解

    mysql exists與not exists實(shí)例詳解

    這篇文章主要介紹了mysql exists與not exists實(shí)例詳解的相關(guān)資料,鑒于 not exists 的效率往往要高于 not in , 所以一般情況下會使用前者替代后者,需要的朋友可以參考下
    2017-07-07
  • MySQL8.0.3 RC版即將發(fā)布 先來看看有哪些變化

    MySQL8.0.3 RC版即將發(fā)布 先來看看有哪些變化

    MySQL8.0.3 RC版即將發(fā)布,這篇文章主要介紹了MySQL8.0.3 RC版的一些新變化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Mysql數(shù)據(jù)庫的主從同步配置

    Mysql數(shù)據(jù)庫的主從同步配置

    這篇文章主要介紹了Mysql主從同步配置的相關(guān)資料,需要的朋友可以參考下文內(nèi)容
    2021-08-08
  • MySQL數(shù)據(jù)查詢limit子句用法舉例

    MySQL數(shù)據(jù)查詢limit子句用法舉例

    這篇文章主要介紹了MySQL數(shù)據(jù)查詢limit子句用法的相關(guān)資料,LIMIT子句在MySQL中用于限制查詢結(jié)果集的行數(shù),適用于分頁顯示和限制數(shù)據(jù)量,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • MySQL中的RIGHT?JOIN和CROSS?JOIN操作示例

    MySQL中的RIGHT?JOIN和CROSS?JOIN操作示例

    本文詳細(xì)介紹了MySQL中的RIGHT?JOIN和CROSS?JOIN操作,RIGHT?JOIN返回右表中的所有記錄及與左表中的記錄相匹配的記錄,而CROSS?JOIN返回兩個(gè)表中所有可能的組合,通過實(shí)際示例和輸出結(jié)果,我們展示了如何使用RIGHT?JOIN和CROSS?JOIN進(jìn)行數(shù)據(jù)庫查詢,一起看看吧
    2023-07-07
  • MYSQL GROUP BY用法詳解

    MYSQL GROUP BY用法詳解

    這篇文章主要為大家詳細(xì)介紹了MYSQL GROUP BY用法,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 修改Innodb的數(shù)據(jù)頁大小以優(yōu)化MySQL的方法

    修改Innodb的數(shù)據(jù)頁大小以優(yōu)化MySQL的方法

    這篇文章主要介紹了修改Innodb的數(shù)據(jù)頁大小以優(yōu)化MySQL的方法,Innodb是MySQL下一個(gè)頗具人氣的數(shù)據(jù)引擎,需要的朋友可以參考下
    2015-05-05

最新評論