最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 加鎖控制并發(fā)的方法

 更新時(shí)間:2021年01月29日 11:53:32   作者:雪山飛豬  
這篇文章主要介紹了MySQL 加鎖控制并發(fā)的方法,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下

前言

鎖總體可以分為樂(lè)觀鎖和悲觀鎖,簡(jiǎn)單說(shuō),樂(lè)觀鎖用版本號(hào)控制,悲觀鎖用鎖控制。

下面是待會(huì)要用來(lái)測(cè)試的數(shù)據(jù)

# 添加一個(gè)user表
CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `name` varchar(255) NOT NULL COMMENT '姓名',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
# 插入3條數(shù)據(jù)
INSERT INTO `users` (`id`, `name`)
VALUES
 (1, '雪山飛豬'),
 (2, 'chenqionghe'),
 (3, 'cqh');

查詢結(jié)果如下:

一、樂(lè)觀鎖

核心原理是增加一個(gè)version的字段來(lái)控制。
舉個(gè)場(chǎng)景,我們希望并發(fā)更新單行記錄的時(shí)候的時(shí)候,只有一個(gè)進(jìn)程更新成功,如下

UPDATE users SET name="雪山飛豬" WHERE id=3
UPDATE users SET name="chenqionghe" WHERE id=3

上面這兩個(gè)sql最終都會(huì)更新成功,且以最后更新結(jié)果為主。

解決辦法是添加一個(gè)version字段

添加version字段

ALTER TABLE users ADD `version` INT NOT NULL DEFAULT '0'

解決辦法是添加一個(gè)version字段,每個(gè)更新時(shí)where條件都加上它,并且也更新它

UPDATE users SET name="雪山飛豬",version=version+1 WHERE id=3 AND version=0
UPDATE users SET name="chenqionghe",version=version+1 WHERE id=3 AND version=0

這次變成了只會(huì)更新成功一次,誰(shuí)先搶到這條記錄以誰(shuí)為主,因?yàn)楫?dāng)前一個(gè)進(jìn)程更新成功后版本號(hào)已經(jīng)變化了,第二個(gè)進(jìn)程找不到這條記錄了。
這就是最簡(jiǎn)單的CAS機(jī)制。

二、悲觀鎖

其實(shí)類似Go語(yǔ)言里的Mutex和RwMutex讀鎖

讀鎖

也叫共享鎖或S鎖,當(dāng)給數(shù)據(jù)表加上共享鎖的時(shí)候,表就變成了只讀模式。
我們可以鎖全表,也可以鎖全表或部分行,如下

全表鎖(LOCK TABLE 表 READ)

語(yǔ)法如下

LOCK TABLE 表 READ
UNLOCK TABLE;

我們來(lái)測(cè)試一個(gè),第一個(gè)進(jìn)程執(zhí)行

LOCK TABLE users READ;

第二個(gè)進(jìn)程執(zhí)行正常讀

SELECT * FROM users WHERE id=1;

可以正常查詢。我們?cè)賮?lái)執(zhí)行一下更新

UPDATE users SET name="chenqionghe" WHERE id=1

出現(xiàn)了等待。

我們給第一個(gè)進(jìn)程解鎖

再看第二個(gè)進(jìn)程,已經(jīng)更新成功

行鎖(SELECT ... LOCK IN SHARE MODE)

BEGIN;
SELECT * FROM users WHERE id IN (1,2) LOCK IN SHARE MODE
COMMIT;

必須配合事務(wù)使用,BEIN開始后,鎖定的行,外部只能查詢,不能更新

我們來(lái)測(cè)試一下,第一個(gè)進(jìn)程執(zhí)行

BEGIN;
SELECT * FROM users WHERE id IN (1,2) LOCK IN SHARE MODE

這里鎖定了id為1和2的記錄行。我們第二個(gè)進(jìn)程執(zhí)行更新

UPDATE users SET name="雪山飛豬" WHERE id=1

又一次出現(xiàn)了等待。
好,這時(shí)候我們將第一個(gè)進(jìn)程的事務(wù)提交

COMMIT;

第二個(gè)進(jìn)程更新成功了,如下

寫鎖

也排他鎖、獨(dú)占鎖,理解成讀和寫都不行了,語(yǔ)法如下

全表鎖(LOCK TABLE 表 WRITE)

LOCK TABLE users WRITE;

這時(shí)候已經(jīng)鎖定全表,我們?cè)儆昧硪粋€(gè)進(jìn)程查詢一下id為1的數(shù)據(jù)

SELECT * FROM users WHERE id=1

可以看到,查詢已經(jīng)發(fā)生了等待。
我們?cè)賹⒌谝粋€(gè)進(jìn)程解鎖

UNLOCK TABLE

這時(shí)候,第二個(gè)進(jìn)程立馬查詢成功

行鎖(SELECT ... FOR UPDATE)

當(dāng)我們對(duì)數(shù)據(jù)進(jìn)行更新的時(shí)候(INSERT、DELETE、UPDATE)的時(shí)候,數(shù)據(jù)庫(kù)會(huì)自動(dòng)使用排它鎖,防止其他事務(wù)操作該數(shù)據(jù)

BEGIN;
SELECT * FROM users WHERE id IN (1,2) LOCK IN SHARE MODE
COMMIT;

我們?cè)賮?lái)測(cè)試一下,第一個(gè)進(jìn)程鎖定id為1和2的記錄

BEGIN;
SELECT * FROM users WHERE id IN (1,2) FOR UPDATE

注意:這時(shí)候事務(wù)沒(méi)提交

我們先用第二個(gè)進(jìn)程來(lái)更新id為3的記錄(未被鎖定)

UPDATE users SET name="chenqionghe" WHERE id=3

執(zhí)行成功了。
我們?cè)賮?lái)更新一個(gè)id為1的記錄

UPDATE users SET name="chenqionghe" WHERE id=1

發(fā)生了等待,說(shuō)明已經(jīng)被鎖定了。
好,我們提交第一個(gè)進(jìn)程的事務(wù)

COMMIT;

再去看第二個(gè)進(jìn)程,已經(jīng)更新成功

簡(jiǎn)單說(shuō)樂(lè)觀鎖用version控制,悲觀鎖的表鎖一般用不著,行的讀鎖用LOCK IN SHARE MODE,寫鎖用FRO UPDATE,就是這么簡(jiǎn)單!

以上就是MySQL 加鎖控制并發(fā)的方法的詳細(xì)內(nèi)容,更多關(guān)于MySQL 加鎖控制并發(fā)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL鎖阻塞的深入分析

    MySQL鎖阻塞的深入分析

    這篇文章主要給大家介紹了關(guān)于MySQL鎖阻塞的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • MySQL慢查詢查找和調(diào)優(yōu)測(cè)試

    MySQL慢查詢查找和調(diào)優(yōu)測(cè)試

    MySQL慢查詢查找和調(diào)優(yōu)測(cè)試,接下來(lái)詳細(xì)介紹,需要了解的朋友可以參考下
    2013-01-01
  • MySQL基礎(chǔ)教程第一篇 mysql5.7.18安裝和連接教程

    MySQL基礎(chǔ)教程第一篇 mysql5.7.18安裝和連接教程

    這篇文章主要為大家詳細(xì)介紹了MySQL基礎(chǔ)教程第一篇,mysql5.7.18安裝和連接教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Mysql實(shí)戰(zhàn)練習(xí)之簡(jiǎn)單圖書管理系統(tǒng)

    Mysql實(shí)戰(zhàn)練習(xí)之簡(jiǎn)單圖書管理系統(tǒng)

    由于課設(shè)需要做這個(gè),于是就抽了點(diǎn)閑余時(shí)間,寫了下,用Mysql與Java,基本全部都涉及到,包括借書/還書,以及書籍信息的更新,查看所有的書籍。需要的朋友可以參考下
    2021-09-09
  • Mysql8.0修改配置文件my.ini的坑及解決

    Mysql8.0修改配置文件my.ini的坑及解決

    使用記事本直接編輯my.ini文件保存后,可能會(huì)導(dǎo)致MySQL無(wú)法啟動(dòng),因?yàn)镸ySQL會(huì)以ANSI編碼讀取該文件,解決方法是使用Notepad++打開my.ini文件,選擇ANSI編碼保存
    2025-01-01
  • linux下講解MySQL安裝與登錄方法

    linux下講解MySQL安裝與登錄方法

    MySQL安裝文件已被廣泛應(yīng)用但是也在不斷的更新,這里介紹MySQL安裝文件設(shè)置使用,幫助大家安裝更新MySQL安裝文件系統(tǒng)。
    2010-11-11
  • MySQL索引的5種應(yīng)用

    MySQL索引的5種應(yīng)用

    本文主要介紹了MySQL索引的5種應(yīng)用,包含聚集索引,唯一索引,非唯一(普通)索引,全文索引,組合索引等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • MySQL中配置文件my.cnf因權(quán)限問(wèn)題導(dǎo)致無(wú)法啟動(dòng)的解決方法

    MySQL中配置文件my.cnf因權(quán)限問(wèn)題導(dǎo)致無(wú)法啟動(dòng)的解決方法

    這篇文章主要給大家介紹了關(guān)于MySQL中配置文件my.cnf因權(quán)限問(wèn)題導(dǎo)致無(wú)法啟動(dòng)的解決方法,該無(wú)法啟動(dòng)的錯(cuò)誤提示代碼是:World-writable config file '/etc/my.cnf' is ignored,文中給出了詳細(xì)的解決方法,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • mysql load data infile 的用法(40w數(shù)據(jù) 用了3-5秒導(dǎo)進(jìn)mysql)

    mysql load data infile 的用法(40w數(shù)據(jù) 用了

    測(cè)試數(shù)據(jù)的時(shí)候,生成txt文件應(yīng)該快點(diǎn),再用這種方式導(dǎo)入到mysql 速度上快點(diǎn),40w數(shù)據(jù) 用了3-5秒導(dǎo)進(jìn)mysql
    2013-01-01
  • mysql5.7.14解壓版的安裝圖文教程

    mysql5.7.14解壓版的安裝圖文教程

    MySQL的安裝有兩種方式,一種為msi格式,一個(gè)是zip格式。這篇文章主要介紹了mysql5.7.14解壓版的安裝圖文教程,需要的朋友可以參考下
    2017-05-05

最新評(píng)論

泊头市| 济宁市| 福泉市| 吴忠市| 天峨县| 枣阳市| 石楼县| 茂名市| 黔西县| 哈尔滨市| 肇源县| 肇源县| 泰顺县| 长乐市| 卢氏县| 青阳县| 宣恩县| 临泉县| 普兰店市| 双鸭山市| 南昌市| 邵阳县| 磐安县| 太仓市| 新乐市| 洪雅县| 东平县| 宜章县| 龙游县| 化州市| 玛纳斯县| 紫云| 佛学| 唐海县| 永胜县| 东莞市| 乐东| 建昌县| 托里县| 德清县| 南昌市|