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

數(shù)據(jù)庫常用的事務(wù)隔離級別都有哪些?都是什么原理?

數(shù)據(jù)庫 MySQL
任何支持事務(wù)的數(shù)據(jù)庫,都必須具備四個(gè)特性,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),也就是我們常說的事務(wù)ACID,這樣才能保證事務(wù)((Transaction)中數(shù)據(jù)的正確性。

 什么是事務(wù)隔離?

任何支持事務(wù)的數(shù)據(jù)庫,都必須具備四個(gè)特性,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),也就是我們常說的事務(wù)ACID,這樣才能保證事務(wù)((Transaction)中數(shù)據(jù)的正確性。 

 

[[246426]] 

而事務(wù)的隔離性就是指,多個(gè)并發(fā)的事務(wù)同時(shí)訪問一個(gè)數(shù)據(jù)庫時(shí),一個(gè)事務(wù)不應(yīng)該被另一個(gè)事務(wù)所干擾,每個(gè)并發(fā)的事務(wù)間要相互進(jìn)行隔離。

如果沒有事務(wù)隔離,會出現(xiàn)什么樣的情況呢?

假設(shè)我們現(xiàn)在有這樣一張表(T),里面記錄了很多牛人的名字,我們不進(jìn)行事務(wù)的隔離看看會發(fā)生什么呢? 

[[246427]] 

***天,事務(wù)A訪問了數(shù)據(jù)庫,它干了一件事情,往數(shù)據(jù)庫里加上了新來的牛人的名字,但是沒有提交事務(wù)。 

  1. insert into T values (4, '牛D'); 

這時(shí),來了另一個(gè)事務(wù)B,他要查詢所有牛人的名字。 

  1. select Name from T; 

這時(shí),如果沒有事務(wù)之間沒有有效隔離,那么事務(wù)B返回的結(jié)果中就會出現(xiàn)“牛D”的名字。這就是“臟讀(dirty read)”。

第二天,事務(wù)A訪問了數(shù)據(jù)庫,他要查看ID是1的牛人的名字,于是執(zhí)行了 

  1. select Name from T where ID = 1

這時(shí),事務(wù)B來了,因?yàn)镮D是1的牛人改名字了,所以要更新一下,然后提交了事務(wù)。 

  1. update T set Name = '不牛' where ID = 1

接著,事務(wù)A還想再看看ID是1的牛人的名字,于是又執(zhí)行了 

  1. select Name from T where ID = 1

結(jié)果,兩次讀出來的ID是1的牛人名字竟然不相同,這就是不可重復(fù)讀(unrepeatable read)。 

[[246428]] 

第三天,事務(wù)A訪問了數(shù)據(jù)庫,他想要看看數(shù)據(jù)庫的牛人都有哪些,于是執(zhí)行了 

  1. select * from T; 

這時(shí)候,事務(wù)B來了,往數(shù)據(jù)庫加入了一個(gè)新的牛人。 

  1. insert into T values(4, '牛D'); 

這時(shí)候,事務(wù)A忘了剛才的牛人都有哪些了,于是又執(zhí)行了。 

  1. select * from T; 

結(jié)果,***次有三個(gè)牛人,第二次有四個(gè)牛人。

相信這個(gè)時(shí)候事務(wù)A就蒙了,剛才發(fā)生了什么?這種情況就叫“幻讀(phantom problem)”。 

[[246429]] 

為了防止出現(xiàn)臟讀、不可重復(fù)讀、幻讀等情況,我們就需要根據(jù)我們的實(shí)際需求來設(shè)置數(shù)據(jù)庫的隔離級別。

數(shù)據(jù)庫都有哪些隔離級別呢?

一般的數(shù)據(jù)庫,都包括以下四種隔離級別:

  1. 讀未提交(Read Uncommitted)
  2. 讀提交(Read Committed)
  3. 可重復(fù)讀(Repeated Read)
  4. 串行化(Serializable)

如何使用這些隔離級別,那就需要根據(jù)業(yè)務(wù)的實(shí)際情況來進(jìn)行判斷了。

我們接下來就看看這四個(gè)隔離級別的具體情況

讀未提交(Read Uncommitted)

讀未提交,顧名思義,就是可以讀到未提交的內(nèi)容。

因此,在這種隔離級別下,查詢是不會加鎖的,也由于查詢的不加鎖,所以這種隔離級別的一致性是最差的,可能會產(chǎn)生“臟讀”、“不可重復(fù)讀”、“幻讀”。

如無特殊情況,基本是不會使用這種隔離級別的。

讀提交(Read Committed)

讀提交,顧名思義,就是只能讀到已經(jīng)提交了的內(nèi)容。

這是各種系統(tǒng)中最常用的一種隔離級別,也是SQL Server和Oracle的默認(rèn)隔離級別。這種隔離級別能夠有效的避免臟讀,但除非在查詢中顯示的加鎖,如: 

  1. select * from T where ID=2 lock in share mode;  
  2. select * from T where ID=2 for update;  

不然,普通的查詢是不會加鎖的。

那為什么“讀提交”同“讀未提交”一樣,都沒有查詢加鎖,但是卻能夠避免臟讀呢?

這就要說道另一個(gè)機(jī)制“快照(snapshot)”,而這種既能保證一致性又不加鎖的讀也被稱為“快照讀(Snapshot Read)” 

[[246430]] 

假設(shè)沒有“快照讀”,那么當(dāng)一個(gè)更新的事務(wù)沒有提交時(shí),另一個(gè)對更新數(shù)據(jù)進(jìn)行查詢的事務(wù)會因?yàn)闊o法查詢而被阻塞,這種情況下,并發(fā)能力就相當(dāng)?shù)牟睢?/p>

而“快照讀”就可以完成高并發(fā)的查詢,不過,“讀提交”只能避免“臟讀”,并不能避免“不可重復(fù)讀”和“幻讀”。

可重復(fù)讀(Repeated Read)

可重復(fù)讀,顧名思義,就是專門針對“不可重復(fù)讀”這種情況而制定的隔離級別,自然,它就可以有效的避免“不可重復(fù)讀”。而它也是MySql的默認(rèn)隔離級別。

在這個(gè)級別下,普通的查詢同樣是使用的“快照讀”,但是,和“讀提交”不同的是,當(dāng)事務(wù)啟動(dòng)時(shí),就不允許進(jìn)行“修改操作(Update)”了,而“不可重復(fù)讀”恰恰是因?yàn)閮纱巫x取之間進(jìn)行了數(shù)據(jù)的修改,因此,“可重復(fù)讀”能夠有效的避免“不可重復(fù)讀”,但卻避免不了“幻讀”,因?yàn)榛米x是由于“插入或者刪除操作(Insert or Delete)”而產(chǎn)生的。

串行化(Serializable)

這是數(shù)據(jù)庫***的隔離級別,這種級別下,事務(wù)“串行化順序執(zhí)行”,也就是一個(gè)一個(gè)排隊(duì)執(zhí)行。

這種級別下,“臟讀”、“不可重復(fù)讀”、“幻讀”都可以被避免,但是執(zhí)行效率奇差,性能開銷也***,所以基本沒人會用。

總結(jié)一下

為什么會出現(xiàn)“臟讀”?因?yàn)闆]有“select”操作沒有規(guī)矩。

為什么會出現(xiàn)“不可重復(fù)讀”?因?yàn)?ldquo;update”操作沒有規(guī)矩。

為什么會出現(xiàn)“幻讀”?因?yàn)?ldquo;insert”和“delete”操作沒有規(guī)矩。

“讀未提(Read Uncommitted)”能預(yù)防啥?啥都預(yù)防不了。

“讀提交(Read Committed)”能預(yù)防啥?使用“快照讀(Snapshot Read)”,避免“臟讀”,但是可能出現(xiàn)“不可重復(fù)讀”和“幻讀”。

“可重復(fù)讀(Repeated Red)”能預(yù)防啥?使用“快照讀(Snapshot Read)”,鎖住被讀取記錄,避免出現(xiàn)“臟讀”、“不可重復(fù)讀”,但是可能出現(xiàn)“幻讀”。

“串行化(Serializable)”能預(yù)防啥?排排坐,吃果果,有效避免“臟讀”、“不可重復(fù)讀”、“幻讀”,不過效果誰用誰知道。

 

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

2020-03-05 09:33:15

數(shù)據(jù)庫事務(wù)隔離事務(wù)

2023-10-11 08:09:53

事務(wù)隔離級別

2018-07-17 10:58:45

數(shù)據(jù)庫數(shù)據(jù)庫事務(wù)隔離級別

2025-03-03 08:20:00

MySQL事務(wù)隔離數(shù)據(jù)庫

2018-07-20 11:10:21

數(shù)據(jù)庫事務(wù)隔離性

2025-02-08 12:05:44

MySQLMyISAMInnoDB

2023-06-01 07:37:48

級別事務(wù)調(diào)度

2018-01-03 08:52:27

MySQL數(shù)據(jù)庫級別

2018-09-06 14:53:39

數(shù)據(jù)庫事務(wù)隔離隔離級別

2010-11-19 16:13:06

oracle事務(wù)隔離級

2018-12-19 16:46:38

MySQL事務(wù)隔離數(shù)據(jù)庫

2009-06-29 17:54:47

Spring事務(wù)隔離

2020-04-01 17:26:57

MySQL事務(wù)隔離級別數(shù)據(jù)庫

2024-09-19 08:10:54

2021-07-26 10:28:13

MySQL事務(wù)隔離

2024-04-26 09:17:20

MySQL事務(wù)隔離

2021-08-04 13:19:42

MySQL 事務(wù)隔離

2022-12-14 08:00:00

數(shù)據(jù)庫分布式數(shù)據(jù)庫隔離

2021-10-11 19:30:02

分布式事務(wù)CAP

2023-12-26 09:34:43

MySQL數(shù)據(jù)庫優(yōu)化
點(diǎn)贊
收藏

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