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

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

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

前言

鎖總體可以分為樂觀鎖和悲觀鎖,簡單說,樂觀鎖用版本號控制,悲觀鎖用鎖控制。

下面是待會要用來測試的數(shù)據(jù)

# 添加一個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é)果如下:

一、樂觀鎖

核心原理是增加一個version的字段來控制。
舉個場景,我們希望并發(fā)更新單行記錄的時候的時候,只有一個進程更新成功,如下

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

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

解決辦法是添加一個version字段

添加version字段

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

解決辦法是添加一個version字段,每個更新時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

這次變成了只會更新成功一次,誰先搶到這條記錄以誰為主,因為當前一個進程更新成功后版本號已經(jīng)變化了,第二個進程找不到這條記錄了。
這就是最簡單的CAS機制。

二、悲觀鎖

其實類似Go語言里的Mutex和RwMutex讀鎖

讀鎖

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

全表鎖(LOCK TABLE 表 READ)

語法如下

LOCK TABLE 表 READ
UNLOCK TABLE;

我們來測試一個,第一個進程執(zhí)行

LOCK TABLE users READ;

第二個進程執(zhí)行正常讀

SELECT * FROM users WHERE id=1;

可以正常查詢。我們再來執(zhí)行一下更新

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

出現(xiàn)了等待。

我們給第一個進程解鎖

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

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

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

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

我們來測試一下,第一個進程執(zhí)行

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

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

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

又一次出現(xiàn)了等待。
好,這時候我們將第一個進程的事務提交

COMMIT;

第二個進程更新成功了,如下

寫鎖

也排他鎖、獨占鎖,理解成讀和寫都不行了,語法如下

全表鎖(LOCK TABLE 表 WRITE)

LOCK TABLE users WRITE;

這時候已經(jīng)鎖定全表,我們再用另一個進程查詢一下id為1的數(shù)據(jù)

SELECT * FROM users WHERE id=1

可以看到,查詢已經(jīng)發(fā)生了等待。
我們再將第一個進程解鎖

UNLOCK TABLE

這時候,第二個進程立馬查詢成功

行鎖(SELECT ... FOR UPDATE)

當我們對數(shù)據(jù)進行更新的時候(INSERT、DELETE、UPDATE)的時候,數(shù)據(jù)庫會自動使用排它鎖,防止其他事務操作該數(shù)據(jù)

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

我們再來測試一下,第一個進程鎖定id為1和2的記錄

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

注意:這時候事務沒提交

我們先用第二個進程來更新id為3的記錄(未被鎖定)

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

執(zhí)行成功了。
我們再來更新一個id為1的記錄

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

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

COMMIT;

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

簡單說樂觀鎖用version控制,悲觀鎖的表鎖一般用不著,行的讀鎖用LOCK IN SHARE MODE,寫鎖用FRO UPDATE,就是這么簡單!

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

相關文章

  • MySQL子查詢用法實例分析

    MySQL子查詢用法實例分析

    這篇文章主要介紹了MySQL子查詢用法,結(jié)合實例形式對比分析了MySQL子查詢的設置技巧,需要的朋友可以參考下
    2016-04-04
  • MySQL數(shù)據(jù)庫索引以及失效場景詳解

    MySQL數(shù)據(jù)庫索引以及失效場景詳解

    索引是一種數(shù)據(jù)結(jié)構(gòu),為了應對不同的場景會有多種實現(xiàn),下面這篇文章主要給大家介紹了關于MySQL數(shù)據(jù)庫索引以及失效場景的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • Mysql錯誤Every derived table must have its own alias解決方法

    Mysql錯誤Every derived table must have its own alias解決方法

    這篇文章主要介紹了Mysql錯誤Every derived table must have its own alias解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 更改Mysql數(shù)據(jù)庫存儲位置的具體步驟

    更改Mysql數(shù)據(jù)庫存儲位置的具體步驟

    首先把mysql的服務先停掉,更改MySQL配置文件My.ini中的數(shù)據(jù)庫存儲主路徑,將老的數(shù)據(jù)庫存儲主路徑中的數(shù)據(jù)庫文件和文件夾復制到新的存儲主路徑,接下來重啟搞定
    2013-07-07
  • 關于避免MySQL替換邏輯SQL的坑爹操作詳解

    關于避免MySQL替換邏輯SQL的坑爹操作詳解

    這篇文章主要給大家介紹了關于避免MySQL替換邏輯SQL的坑爹操作的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • 10個MySQL性能調(diào)優(yōu)的方法

    10個MySQL性能調(diào)優(yōu)的方法

    本文介紹了10個MySQL性能調(diào)優(yōu)的方法,每個方法的講解都很細致,非常實用,,需要的朋友可以參考下
    2015-07-07
  • MySQL8中的存儲引擎以及文件解析

    MySQL8中的存儲引擎以及文件解析

    這篇文章主要介紹了MySQL8中的存儲引擎以及文件使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • MYSQL日志的正確刪除方法詳解

    MYSQL日志的正確刪除方法詳解

    這篇文章主要介紹了MYSQL日志的正確刪除方法,詳細分析了MySQL日志刪除的步驟與相關注意事項,需要的朋友可以參考下
    2016-04-04
  • 深入解析MySQL中的Redo Log、Undo Log和Binlog

    深入解析MySQL中的Redo Log、Undo Log和Binlog

    本文詳細介紹了MySQL中的RedoLog、UndoLog和Binlog的背景、業(yè)務場景、功能、底層實現(xiàn)原理以及使用措施,通過Java代碼示例展示了如何與這些日志進行交互,進一步深化了對MySQL日志系統(tǒng)的理解,理解并合理使用這些日志,可以有效地提升數(shù)據(jù)庫的性能和可靠性
    2024-10-10
  • 利用JuiceFS使MySQL?備份驗證性能提升?10?倍

    利用JuiceFS使MySQL?備份驗證性能提升?10?倍

    這篇文章主要介紹了如何讓?MySQL?備份驗證性能提升?10?倍,JuiceFS?非常適合用來做?MySQL?物理備份,通過不斷調(diào)整?XtraBackup?的參數(shù)和?JuiceFS?的掛載參數(shù),在一個小時內(nèi)將時間縮短到原先的?1/10,下文一起來看相關內(nèi)容的詳細介紹吧
    2022-03-03

最新評論