欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

MySQL樂觀鎖和悲觀鎖如何實(shí)現(xiàn)

這篇文章主要介紹了MySQL樂觀鎖和悲觀鎖如何實(shí)現(xiàn)的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇MySQL樂觀鎖和悲觀鎖如何實(shí)現(xiàn)文章都會(huì)有所收獲,下面我們一起來看看吧。

鐘山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司

鎖分類

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

表結(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ù)版本號(hào)',
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í)就會(huì)等待,直到占有鎖的事務(wù)釋放鎖為止。

這種處理方式能保證數(shù)據(jù)的最大一致性,但是容易導(dǎo)致鎖超時(shí)、并發(fā)程度低等問題。 首先我們開啟事務(wù)一,并且對(duì)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ù)二,對(duì)id=1的數(shù)據(jù)進(jìn)行update操作,查看此時(shí)會(huì)發(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語句也不會(huì)馬上被執(zhí)行,這是因?yàn)槭聞?wù)一沒有commit,也就沒有釋放id=1的數(shù)據(jù)對(duì)應(yīng)的寫鎖。

效果如下圖:

MySQL樂觀鎖和悲觀鎖如何實(shí)現(xiàn)

樂觀鎖

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

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

  • 一個(gè)事務(wù)在讀取數(shù)據(jù)時(shí),將對(duì)應(yīng)的版本號(hào)字段讀取出來,假設(shè)此時(shí)的版本號(hào)是1。

  • 另外一個(gè)事務(wù)也是執(zhí)行同樣的讀取操作。當(dāng)事務(wù)一提交時(shí),對(duì)版本號(hào)執(zhí)行+1,此時(shí)該數(shù)據(jù)行的版本號(hào)就是2。

  • 第二個(gè)事務(wù)執(zhí)行修改操作時(shí),針對(duì)業(yè)務(wù)數(shù)據(jù)做條件,并默認(rèn)增加一個(gè)版本號(hào)作為where條件。此時(shí)修改語句中的版本號(hào)字段是不滿足where條件,該事務(wù)執(zhí)行失敗。通過這種方式來達(dá)到鎖的功能。

MySQL樂觀鎖和悲觀鎖如何實(shí)現(xiàn)

客戶端一:

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ù)。

適用場(chǎng)景

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

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

關(guān)于“MySQL樂觀鎖和悲觀鎖如何實(shí)現(xiàn)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“MySQL樂觀鎖和悲觀鎖如何實(shí)現(xiàn)”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章標(biāo)題:MySQL樂觀鎖和悲觀鎖如何實(shí)現(xiàn)
網(wǎng)頁地址:http://aaarwkj.com/article12/jjgjdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站內(nèi)鏈、微信小程序、企業(yè)建站、軟件開發(fā)企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
一区二区三区三级视频| 亚洲午夜精品毛片成人| 日韩精品高清中文字幕| av一区二区三区三| 中文字幕欧美日韩人妻| 最新日韩中文字幕在线播放| 女厕所偷拍一区二区三区| 亚洲伦理av在线观看| 全部网站免费在线观看等| 大香蕉欧美日韩在线视频| 婷婷丁香六月激情综合| 亚洲综合一区二区三区四区在线| 久久偷拍精品视频久久| 日韩成人在线视频中文字幕| 国产精品亚洲视频欧美视频| 亚洲天堂网免费在线看| 亚洲国产精品激情在线 | 中文字幕一区二区av| 欧美欧美欧美欧美一二三区| 日本av电影一区二区三区四区| 亚洲一区二区三区在线播| 韩国理伦三级做爰观看| 欧美精品日本一区二区| 国产91在线观看网站| 亚洲熟女内射特写一区| 亚洲国产精品一区二区三区在线| 日日嗨av特一级黄淫片| 亚洲成熟中老妇女视频| 精品欧美高清免费视频| 国产三级传媒视频在线观看| 极品女神福利视频久久| 日韩免费色视频一区| 国一区二区三区四区av| 欧美大片黄片在线观看| 99久久免费中文字幕| 日韩av中文一区二区| 国产一区二区精品久久岳√| 手机在线观看av大片| 啊啊…嗯嗯…用力免费观看视频| 亚洲国产精品区一区二区| 伊人久久精品一区二区|