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

MySQL樂觀鎖和悲觀鎖具體實(shí)現(xiàn)

 更新時(shí)間:2022年09月05日 11:33:55   作者:7small7???????  
這篇文章主要介紹了MySQL樂觀鎖和悲觀鎖具體實(shí)現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言

對于MySQL中的樂觀鎖和悲觀鎖,可能很多的開發(fā)者還不是很熟悉,并不知道其中具體是如何實(shí)現(xiàn)的。本文就針對這個問題做一個實(shí)際案例演示,讓你徹底明白這兩種鎖的區(qū)別。

鎖分類

MySQL的中鎖按照范圍主要分為表鎖、行鎖和頁面鎖。其中myisam存儲引擎只支持表鎖,InnoDB不僅僅支持行鎖,在一定程度上也支持表鎖。按照行為可以分為共享鎖(讀鎖)、排他鎖(寫鎖)和意向鎖。按照思想分為樂觀鎖和悲觀鎖。

今天的文章演示一下實(shí)際中的樂觀鎖和悲觀鎖是如何操作的。

表結(jié)構(gòu)

下面的SQL語句是表的結(jié)構(gòu):

CREATE TABLE `demo`.`user` (
`id` int(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`sex` tinyint(1) UNSIGNED NOT NULL DEFAULT 0,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`version` int(1) NULL DEFAULT 1 COMMENT '數(shù)據(jù)版本號',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;

插入模擬數(shù)據(jù):

BEGIN;
INSERT INTO `user` VALUES (0000000001, '張三', 0, '18228937997@163.com', '18228937997', 1);
INSERT INTO `user` VALUES (0000000002, '李四', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000003, '李四1', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000004, '李四2', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000005, '李四3', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000006, '李四4', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000007, '李四55', 0, '1005349393@163.com', '15683202302', 1);
COMMIT;

表中數(shù)據(jù)。

mysql root@127.0.0.1:demo> select * from user;
+----+--------+-----+---------------------+-------------+---------+
| id | name | sex | email | mobile | version |
+----+--------+-----+---------------------+-------------+---------+
| 1 | 張三 | 0 | 18228937997@163.com | 18228937997 | 2 |
| 2 | 李四 | 0 | 1005349393@163.com | 15683202302 | 1 |
| 3 | 李四1 | 0 | 1005349393@163.com | 15683202302 | 1 |
| 4 | 李四2 | 0 | 1005349393@163.com | 15683202302 | 1 |
| 5 | 李四3 | 0 | 1005349393@163.com | 15683202302 | 1 |
| 6 | 李四4 | 0 | 1005349393@163.com | 15683202302 | 1 |
| 7 | 李四55 | 0 | 1005349393@163.com | 15683202302 | 1 |
+----+--------+-----+---------------------+-------------+---------+
7 rows in set
Time: 0.011s

悲觀鎖

悲觀鎖,比較消極的一種鎖處理方式。直接在操作數(shù)據(jù)時(shí),搶占鎖。其他的事務(wù)在進(jìn)行時(shí)就會等待,直到占有鎖的事務(wù)釋放鎖為止。

這種處理方式能保證數(shù)據(jù)的最大一致性,但是容易導(dǎo)致鎖超時(shí)、并發(fā)程度低等問題。 首先我們開啟事務(wù)一,并且對id=1的數(shù)據(jù)進(jìn)行update操作,此時(shí)我們不提交事務(wù)。

mysql root@127.0.0.1:demo> begin;
Query OK, 0 rows affected
Time: 0.002s
mysql root@127.0.0.1:demo> update `user` set name = '張三111111'where id = 1;
Query OK, 1 row affected
Time: 0.004s

接著我們開啟事務(wù)二,對id=1的數(shù)據(jù)進(jìn)行update操作,查看此時(shí)會發(fā)生什么情況?

mysql root@127.0.0.1:demo> begin;
Query OK, 0 rows affected
Time: 0.002s
mysql root@127.0.0.1:demo> update `user` set sex = 1 where id = 1;

我們執(zhí)行完update語句之后,就處于等待狀態(tài),SQL語句也不會馬上被執(zhí)行,這是因?yàn)槭聞?wù)一沒有commit,也就沒有釋放id=1的數(shù)據(jù)對應(yīng)的寫鎖。

效果如下圖:

通過上面的例子,我們就能比較直觀的感受到悲觀鎖的實(shí)現(xiàn)過程是如何的。

樂觀鎖

樂觀鎖認(rèn)為數(shù)據(jù)一般情況下不會造成沖突,只有當(dāng)數(shù)據(jù)去執(zhí)行修改情況時(shí),才會針對數(shù)據(jù)沖突做處理。這里是如何發(fā)現(xiàn)沖突了呢?常規(guī)的方式,都是在數(shù)據(jù)行上加一個版本號或者時(shí)間戳等字段。(本文使用version作為版本好方式,使用時(shí)間戳方式同理)

樂觀鎖的實(shí)現(xiàn)原理:

  • 一個事務(wù)在讀取數(shù)據(jù)時(shí),將對應(yīng)的版本號字段讀取出來,假設(shè)此時(shí)的版本號是1。
  • 另外一個事務(wù)也是執(zhí)行同樣的讀取操作。當(dāng)事務(wù)一提交時(shí),對版本號執(zhí)行+1,此時(shí)該數(shù)據(jù)行的版本號就是2。
  • 第二個事務(wù)執(zhí)行修改操作時(shí),針對業(yè)務(wù)數(shù)據(jù)做條件,并默認(rèn)增加一個版本號作為where條件。此時(shí)修改語句中的版本號字段是不滿足where條件,該事務(wù)執(zhí)行失敗。通過這種方式來達(dá)到鎖的功能。

客戶端一:

mysql root@127.0.0.1:demo> select * from user where id = 1;
+----+------------+-----+---------------------+-------------+---------+
| id | name | sex | email | mobile | version |
+----+------------+-----+---------------------+-------------+---------+
| 1 | 張三111111 | 0 | 18228937997@163.com | 18228937997 | 1 |
+----+------------+-----+---------------------+-------------+---------+
1 row in set
Time: 0.012s
mysql root@127.0.0.1:demo> update `user` set name = '事務(wù)一', version = version + 1 where id = 1 and version = 1;
Query OK, 1 row affected
Time: 0.008s
mysql root@127.0.0.1:demo> select * from user where id = 1;
+----+--------+-----+---------------------+-------------+---------+
| id | name | sex | email | mobile | version |
+----+--------+-----+---------------------+-------------+---------+
| 1 | 事務(wù)一 | 1 | 18228937997@163.com | 18228937997 | 2 |
+----+--------+-----+---------------------+-------------+---------+
1 row in set
Time: 0.009s

執(zhí)行update語句的順序應(yīng)該在客戶端二執(zhí)行了select之后,在執(zhí)行。

客戶端二:

mysql root@127.0.0.1:demo> select * from user where id = 1;
+----+------------+-----+---------------------+-------------+---------+
| id | name | sex | email | mobile | version |
+----+------------+-----+---------------------+-------------+---------+
| 1 | 張三111111 | 1 | 18228937997@163.com | 18228937997 | 1 |
+----+------------+-----+---------------------+-------------+---------+
1 row in set
Time: 0.015s
mysql root@127.0.0.1:demo> update `user` set name = '事務(wù)二', version = version + 1 where id = 1 and version = 1;
Query OK, 0 rows affected
Time: 0.003s
mysql root@127.0.0.1:demo> select * from user where id = 1;
+----+--------+-----+---------------------+-------------+---------+
| id | name | sex | email | mobile | version |
+----+--------+-----+---------------------+-------------+---------+
| 1 | 事務(wù)一 | 1 | 18228937997@163.com | 18228937997 | 2 |
+----+--------+-----+---------------------+-------------+---------+
1 row in set
Time: 0.012s

此時(shí)根據(jù)update返回的結(jié)構(gòu),可以看出受影響的行數(shù)為0,同時(shí)select查詢之后,返現(xiàn)數(shù)據(jù)也是事務(wù)一的數(shù)據(jù)。

適用場景

悲觀鎖:比較適合寫入操作比較頻繁的場景,如果出現(xiàn)大量的讀取操作,每次讀取的時(shí)候都會進(jìn)行加鎖,這樣會增加大量的鎖的開銷,降低了系統(tǒng)的吞吐量。

樂觀鎖:比較適合讀取操作比較頻繁的場景,如果出現(xiàn)大量的寫入操作,數(shù)據(jù)發(fā)生沖突的可能性就會增大,為了保證數(shù)據(jù)的一致性,應(yīng)用層需要不斷的重新獲取數(shù)據(jù),這樣會增加大量的查詢操作,降低了系統(tǒng)的吞吐量。

總結(jié)

兩種所各有優(yōu)缺點(diǎn),讀取頻繁使用樂觀鎖,寫入頻繁使用悲觀鎖。

像樂觀鎖適用于寫比較少的情況下,即沖突真的很少發(fā)生的時(shí)候,這樣可以省去了鎖的開銷,加大了系統(tǒng)的整個吞吐量。但如果經(jīng)常產(chǎn)生沖突,上層應(yīng)用會不斷的進(jìn)行retry,這樣反倒是降低了性能,所以這種情況下用悲觀鎖就比較合適,之所以用悲觀鎖就是因?yàn)閮蓚€用戶更新同一條數(shù)據(jù)的概率高,也就是沖突比較嚴(yán)重的情況下,所以才用悲觀鎖。

悲觀鎖比較適合強(qiáng)一致性的場景,但效率比較低,特別是讀的并發(fā)低。樂觀鎖則適用于讀多寫少,并發(fā)沖突少的場景。

到此這篇關(guān)于MySQL樂觀鎖和悲觀鎖具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL樂觀鎖和悲觀鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • win10下MySQL 8.0登錄Access denied for user‘root’@‘localhost’ (using password: YES)問題的解決方法

    win10下MySQL 8.0登錄Access denied for user‘root’@‘localhost’ (u

    這篇文章主要介紹了win10下MySQL 8.0登錄Access denied for user‘root’@‘localhost’ (using password: YES)問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • MYSQL數(shù)據(jù)庫中常用函數(shù)介紹

    MYSQL數(shù)據(jù)庫中常用函數(shù)介紹

    大家好,本篇文章主要講的是MYSQL數(shù)據(jù)庫中常用函數(shù)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • MYSQL如何 查詢數(shù)據(jù)庫中所有表中的數(shù)據(jù)量

    MYSQL如何 查詢數(shù)據(jù)庫中所有表中的數(shù)據(jù)量

    INFORMATION_SCHEMA.TABLES 是 MySQL 中的系統(tǒng)表,用于存儲關(guān)于數(shù)據(jù)庫中的表的信息,這篇文章主要介紹了MYSQL如何 查詢數(shù)據(jù)庫中所有表中的數(shù)據(jù)量,需要的朋友可以參考下
    2024-01-01
  • MySQL8重置root賬戶密碼圖文教程超詳細(xì)講解

    MySQL8重置root賬戶密碼圖文教程超詳細(xì)講解

    root賬戶為MySQL的超級管理員用戶,擁有MySQL提供的所有權(quán)限,這篇文章主要介紹了MySQL8重置root賬戶密碼圖文教程,需要的朋友可以參考下
    2023-05-05
  • mysql8.0?.ibd文件恢復(fù)表結(jié)構(gòu)的實(shí)現(xiàn)

    mysql8.0?.ibd文件恢復(fù)表結(jié)構(gòu)的實(shí)現(xiàn)

    本文主要介紹了mysql8.0?.ibd文件恢復(fù)表結(jié)構(gòu)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • mysql 求解求2個或以上字段為NULL的記錄

    mysql 求解求2個或以上字段為NULL的記錄

    這篇文章主要介紹了mysql 求解求2個或以上字段為NULL的記錄,需要的朋友可以參考下
    2017-05-05
  • MySQL?中的權(quán)限管理及驗(yàn)證流程

    MySQL?中的權(quán)限管理及驗(yàn)證流程

    這篇文章主要介紹了MySQL?中的權(quán)限管理及驗(yàn)證流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • MySQL數(shù)據(jù)庫索引原理及優(yōu)化策略

    MySQL數(shù)據(jù)庫索引原理及優(yōu)化策略

    MySQL數(shù)據(jù)庫索引是一種數(shù)據(jù)結(jié)構(gòu),用于提高數(shù)據(jù)查詢的效率,加快數(shù)據(jù)檢索的速度。索引基于樹結(jié)構(gòu)實(shí)現(xiàn),可以通過B+樹等算法來優(yōu)化索引效率。MySQL中常見的索引類型包括主鍵索引、唯一索引、普通索引、全文索引等
    2023-04-04
  • Mysql5.7.17 winx64.zip解壓縮版安裝配置圖文教程

    Mysql5.7.17 winx64.zip解壓縮版安裝配置圖文教程

    這篇文章主要介紹了Mysql5.7.17 winx64.zip解壓縮版安裝配置圖文教程,需要的朋友可以參考下
    2018-03-03
  • MySQL 5.7安裝中的常見問題分析及解決方案

    MySQL 5.7安裝中的常見問題分析及解決方案

    在Linux服務(wù)器上安裝MySQL數(shù)據(jù)庫時(shí),尤其是在CentOS 7等操作系統(tǒng)上,可能會遇到一些安裝包和依賴關(guān)系相關(guān)的錯誤,這些問題的產(chǎn)生原因可以是多個方面,本文將通過對具體錯誤的分析和解決方案的闡述,幫助大家快速解決在安裝MySQL 5.7版本過程中可能遇到的問題
    2024-11-11

最新評論

巧家县| 沙湾县| 无极县| 博白县| 磴口县| 崇左市| 射阳县| 商河县| 饶河县| 麦盖提县| 衡水市| 海原县| 金湖县| 称多县| 长葛市| 江川县| 诸城市| 汶川县| 土默特右旗| 北流市| 清涧县| 左贡县| 青川县| 纳雍县| 紫阳县| 昌吉市| 万荣县| 哈尔滨市| 临猗县| 大田县| 观塘区| 黄龙县| 娄底市| 汤阴县| 遵义县| 连云港市| 黄陵县| 龙州县| 大田县| 阿巴嘎旗| 五常市|