偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

 這是一道經(jīng)典的程序員面試題,在Mysql中,如果有多個(gè)事務(wù)同時(shí)訪問同一行數(shù)據(jù),那么需要加鎖么?我們都知道,在Mysql中有行鎖,如果有多個(gè)事務(wù)同時(shí)修改同一行數(shù)據(jù),那么需要加鎖來防止并發(fā)問題。那么,如果有事務(wù)修改數(shù)據(jù),又有事務(wù)讀取這個(gè)數(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ù)在做變更的時(shí)候,也能被讀取到。

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

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

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

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

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

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

很顯然,在這樣的一種數(shù)據(jù)中,同一行數(shù)據(jù)其實(shí)在數(shù)據(jù)庫中是多行的存在。這本質(zhì)上是一種空間換時(shí)間的方案,在多版本控制中,我們幾乎可以做到所有的讀操作都是無阻塞的,可以避免加鎖,這與互聯(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-02-06 08:58:09

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

2020-05-06 15:02:58

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

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è)計(jì)人生第一份工作

2013-01-17 10:10:44

程序員

2018-12-03 09:42:32

Java程序員阿里面試

2009-08-02 10:21:39

ASP.NET程序員面ASP.NET

2011-03-29 14:31:41

CC++

2013-01-10 09:22:58

程序員面試程序員面試經(jīng)歷
點(diǎn)贊
收藏

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