自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

阿里面試:MySQL樂(lè)觀鎖是什么?底層實(shí)現(xiàn)原理?

數(shù)據(jù)庫(kù) MySQL
MySQL的樂(lè)觀鎖通過(guò)版本號(hào)或時(shí)間戳機(jī)制實(shí)現(xiàn),其核心原理:是在更新數(shù)據(jù)時(shí)檢查數(shù)據(jù)是否被其他事務(wù)修改,從而避免并發(fā)沖突。

MySQL樂(lè)觀鎖經(jīng)常在大廠被問(wèn)到,比如:MySQL樂(lè)觀鎖是什么?實(shí)現(xiàn)原理?…等,下面我就來(lái)詳解MySQL樂(lè)觀鎖@mikechen

MySQL樂(lè)觀鎖

MySQL樂(lè)觀鎖,顧名思義就是很“樂(lè)觀”,也就在更新數(shù)據(jù)時(shí)不加鎖,而是通過(guò)“版本號(hào)”、或“時(shí)間戳”來(lái)檢測(cè)數(shù)據(jù)是否被修改。

MySQL樂(lè)觀鎖實(shí)現(xiàn)原理

MySQL的樂(lè)觀鎖通過(guò)版本號(hào)或時(shí)間戳機(jī)制實(shí)現(xiàn),其核心原理:是在更新數(shù)據(jù)時(shí)檢查數(shù)據(jù)是否被其他事務(wù)修改,從而避免并發(fā)沖突。

圖片圖片

實(shí)現(xiàn)步驟,如下:

第一:增加“版本號(hào)”。

在數(shù)據(jù)庫(kù)表,中添加一個(gè)版本號(hào)字段,通常命名為 version 。

ALTER TABLE orders ADD COLUMN version INT DEFAULT 1;

這個(gè)字段用于記錄數(shù)據(jù)的版本信息,每當(dāng)數(shù)據(jù)被更新時(shí),版本號(hào)會(huì)自動(dòng)遞增。

第二:讀取數(shù)據(jù)。

獲取當(dāng)前數(shù)據(jù)的版本號(hào),(如:version字段)、或時(shí)間戳。

讀取數(shù)據(jù)
 SELECT id, stock, version FROM product WHERE id = 1;

第三:提交更新。

更新數(shù)據(jù)時(shí),校驗(yàn)版本號(hào),是否與讀取時(shí)一致。

UPDATE table 
 SET column1 = new_value, version = version + 1 
 WHERE id = target_id AND version = old_version;

比如,通過(guò)版本號(hào)的方式,更新庫(kù)存:

更新時(shí)校驗(yàn)版本號(hào)
 UPDATE product 
 SET stock = stock - 1, version = version + 1 
 WHERE id = 1 AND version = 1; -- 假設(shè)當(dāng)前version=1

在更新數(shù)據(jù)時(shí),檢查 version 字段的值是否與預(yù)期一致,如果一致則更新數(shù)據(jù)并遞增 version 值,否則更新失敗。

圖片圖片

比如:成功(affected rows > 0),更新成功,業(yè)務(wù)繼續(xù)執(zhí)行。

失?。╝ffected rows = 0),說(shuō)明數(shù)據(jù)已被其他事務(wù)修改,需要重新讀取數(shù)據(jù)并重試。

在讀多寫少的場(chǎng)景下,樂(lè)觀鎖不會(huì)像悲觀鎖那樣在讀操作時(shí)加鎖,從而減少了鎖的開(kāi)銷,這是MySQL樂(lè)觀鎖最大的優(yōu)點(diǎn)。

適用于數(shù)據(jù)沖突較少的場(chǎng)景,避免鎖帶來(lái)的性能損耗。

但是,在大部分金融交易,要求數(shù)據(jù)強(qiáng)一致性的場(chǎng)景,則需要悲觀鎖。

責(zé)任編輯:武曉燕 來(lái)源: mikechen的互聯(lián)網(wǎng)架構(gòu)
相關(guān)推薦

2025-03-27 04:00:00

2024-07-05 17:47:21

@Async項(xiàng)目啟動(dòng)類

2023-03-17 16:47:23

索引開(kāi)發(fā)大數(shù)據(jù)

2023-11-29 08:00:53

JavaTreeMap底層

2023-02-23 10:32:52

樂(lè)觀鎖

2021-09-27 07:11:18

MySQLACID特性

2023-10-13 00:00:00

并發(fā)樂(lè)觀鎖CAS

2024-04-28 08:52:33

RabbitMQ延遲隊(duì)列延遲插件

2024-08-29 16:30:27

2024-02-29 16:49:20

volatileJava并發(fā)編程

2024-10-28 08:28:59

2017-05-16 08:59:16

MVCCMYSQL樂(lè)觀鎖

2018-10-15 16:30:14

數(shù)據(jù)庫(kù)索引Mysql

2024-03-14 14:56:22

反射Java數(shù)據(jù)庫(kù)連接

2023-09-21 10:50:23

MySQL數(shù)據(jù)庫(kù)

2024-04-19 08:23:06

2024-08-12 17:36:54

2024-09-06 11:52:47

2021-03-30 09:45:11

悲觀鎖樂(lè)觀鎖Optimistic

2023-01-04 07:54:03

HashMap底層JDK
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)