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

程序員經(jīng)典面試題,MySQL并發(fā)讀寫的時候,都是需要加鎖的么?

數(shù)據(jù)庫 MySQL
這是一道經(jīng)典的程序員面試題,在Mysql中,如果有多個事務(wù)同時訪問同一行數(shù)據(jù),那么需要加鎖么?我們都知道,在Mysql中有行鎖,如果有多個事務(wù)同時修改同一行數(shù)據(jù),那么需要加鎖來防止并發(fā)問題。那么,如果有事務(wù)修改數(shù)據(jù),又有事務(wù)讀取這個數(shù)據(jù),需要加鎖么?

 這是一道經(jīng)典的程序員面試題,在Mysql中,如果有多個事務(wù)同時訪問同一行數(shù)據(jù),那么需要加鎖么?我們都知道,在Mysql中有行鎖,如果有多個事務(wù)同時修改同一行數(shù)據(jù),那么需要加鎖來防止并發(fā)問題。那么,如果有事務(wù)修改數(shù)據(jù),又有事務(wù)讀取這個數(shù)據(jù),需要加鎖么?

[[321894]]

答案是不一定,事實(shí)上,Mysql的很多數(shù)據(jù)庫引擎為了提升并發(fā)性能,都做了多版本并發(fā)控制,也就是我們常說的MVCC,事實(shí)上,除了Mysql,其他知名的關(guān)系型數(shù)據(jù)庫,例如Oracle,PostgreSql也實(shí)現(xiàn)了多版本并發(fā)控制,盡管實(shí)現(xiàn)方式各不相同,但是他們的本質(zhì)為了實(shí)現(xiàn)非阻塞讀,也就是即便是這一行數(shù)據(jù)在做變更的時候,也能被讀取到。

那么,Mysql是如何實(shí)現(xiàn)MVCC的呢?在Mysql的每一行數(shù)據(jù)中,除了我們定義的數(shù)據(jù)列,還有2個隱藏的列,一個是數(shù)據(jù)的變更時間,一個是這行數(shù)據(jù)的刪除時間,當(dāng)然,這個時間并不是簡單的時間戳,而是一個嚴(yán)格遞增的系統(tǒng)版本號。

程序員經(jīng)典面試題,Mysql并發(fā)讀寫的時候,都是需要加鎖的么?

當(dāng)InnoDB發(fā)生Insert事件的時候,會插入當(dāng)前行并且以取得的系統(tǒng)版本號作為數(shù)據(jù)版本號。

當(dāng)InnoDB發(fā)生Delete時間的時候,不會刪除當(dāng)前行,而是把對應(yīng)的行如果未刪除,那么打上刪除標(biāo)記位為當(dāng)前的版本號。

當(dāng)InnoDB發(fā)生Select操作的時候,會取當(dāng)前的系統(tǒng)版本號,然后到數(shù)據(jù)庫中進(jìn)行查詢,他只會查詢比自己當(dāng)前版本號更小的,并且沒有刪除版本號或者刪除版本號比當(dāng)前版本號更小的數(shù)據(jù)。

當(dāng)InnoDB發(fā)生Update事件的時候,不是直接更新舊的數(shù)據(jù),而是插入一條新的數(shù)據(jù),并且把版本號小于這條記錄的并且沒有被打上刪除標(biāo)記的同一主鍵的記錄更新打上刪除標(biāo)記,刪除版本號為當(dāng)前的版本號。

很顯然,在這樣的一種數(shù)據(jù)中,同一行數(shù)據(jù)其實(shí)在數(shù)據(jù)庫中是多行的存在。這本質(zhì)上是一種空間換時間的方案,在多版本控制中,我們幾乎可以做到所有的讀操作都是無阻塞的,可以避免加鎖,這與互聯(lián)網(wǎng)業(yè)務(wù)中,多讀少寫是非常契合的。當(dāng)然了,在Mysql的InnoDB引擎中,只有事務(wù)級別為可重復(fù)讀跟讀提交才可以使用。這是為什么呢?

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2019-09-20 14:25:21

程序員Google人生第一份工作

2020-04-08 10:18:56

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

2019-10-18 09:40:19

程序員固態(tài)硬盤Linux

2020-04-26 09:48:11

MySQL數(shù)據(jù)庫架構(gòu)

2020-05-06 15:02:58

MySQL數(shù)據(jù)庫技術(shù)

2020-02-06 08:58:09

程序員技術(shù)數(shù)據(jù)庫

2012-05-25 10:15:06

Java程序員面試題

2019-07-24 11:30:54

程序員技能開發(fā)者

2014-07-09 13:25:58

程序員天賦技能

2020-03-02 17:00:24

程序員數(shù)據(jù)庫MySQL

2020-03-18 09:33:47

數(shù)據(jù)庫程序員數(shù)組

2020-05-11 10:48:01

技術(shù)資訊

2014-07-28 14:00:40

linux面試題

2021-11-15 22:31:16

面試題小程序Rpc 通信

2020-02-07 10:14:07

程序員設(shè)計人生第一份工作

2018-12-03 09:42:32

Java程序員阿里面試

2011-03-29 14:31:41

CC++

2009-08-02 10:21:39

ASP.NET程序員面ASP.NET

2013-01-17 10:10:44

程序員

2019-10-09 17:22:01

算法數(shù)據(jù)結(jié)構(gòu)程序員
點(diǎn)贊
收藏

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