成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

趣說(shuō)數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別與原理

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維
本文主要討論數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別與原理,接下來(lái)將會(huì)采用葫蘆娃例子幫助理解。下面,我們一起來(lái)看。

本文主要討論數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別與原理,接下來(lái)將會(huì)從以下四點(diǎn)展開(kāi)討論:

  • 事務(wù)隔離的概念
  • 采用葫蘆娃例子幫助理解在沒(méi)有事務(wù)隔離時(shí)引發(fā)的臟讀、不可重復(fù)讀和幻讀
  • 數(shù)據(jù)庫(kù)常見(jiàn)四種隔離級(jí)別
  • “快照讀”概念

事務(wù)隔離的概念

任何支持事務(wù)的數(shù)據(jù)庫(kù),都必須具備四個(gè)特性,分別是:

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔離性(Isolation)
  • 持久性(Durability)

以上四點(diǎn)也就是常說(shuō)的事務(wù)ACID,數(shù)據(jù)庫(kù)具備以上特性才能保證事務(wù)(Transaction)中數(shù)據(jù)的正確性。而其中事務(wù)的隔離性指:事務(wù)間是相互獨(dú)立的,不會(huì)互相影響,既一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)的其他事務(wù)是隔離的。

[[317486]]

沒(méi)有事務(wù)隔離會(huì)引發(fā)什么問(wèn)題?

如果沒(méi)有事務(wù)隔離那么可能會(huì)出現(xiàn)臟讀、不可重復(fù)讀、幻讀等情況。

[[317487]]

為了幫助及加深理解,我們采用熟悉的“葫蘆娃”作為例子。最先藤上有七個(gè)葫蘆,每當(dāng)有一個(gè)葫蘆娃誕生時(shí),老爺爺就會(huì)將他的信息錄入數(shù)據(jù)庫(kù)表中,如下:

趣說(shuō)數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別與原理

某一天,四娃誕生了。事務(wù)A(爺爺)訪問(wèn)了數(shù)據(jù)庫(kù),目的是往數(shù)據(jù)庫(kù)里添加新誕生葫蘆娃的信息,但是還沒(méi)有提交事務(wù)。

  1. insert into T values (4, '四娃','噴水'); 

這時(shí),來(lái)了另一個(gè)事務(wù)B(蛇精),她進(jìn)行了查詢操作,想查詢所有已誕生的葫蘆娃信息

  1. select * from T;  //結(jié)果中出現(xiàn)了四娃的信息 

這時(shí),如果事務(wù)之間沒(méi)有有效隔離,那么 蛇精 查詢數(shù)據(jù)庫(kù)返回的結(jié)果中就會(huì)出現(xiàn) 四娃 的信息,這就是臟讀。

(1) 臟讀:指在自己的事務(wù)中讀到了別人未提交的數(shù)據(jù)

[[317489]]

第二天,事務(wù)A(蛇精)一大早就查詢了數(shù)據(jù)庫(kù)中關(guān)于四娃的信息

  1. select * from T  where ID = 4; //名稱:四娃 能力:噴水 

這時(shí),事務(wù)B(爺爺)來(lái)了,因?yàn)闋敔敯l(fā)現(xiàn)四娃其實(shí)是會(huì)噴火而不是噴水,所以更新一下將改了四娃的能力為噴火,然后提交了事務(wù)。

  1. update T set Ability'噴火' where ID = 4

接著,蛇精(事務(wù)A)還想再查看一次用于確認(rèn)四娃的信息,于是又執(zhí)行了

  1. select * from T  where ID = 4;//名稱:四娃 能力:噴火 

這時(shí)候她驚訝地發(fā)現(xiàn)兩次讀出來(lái)四娃的信息,能力竟然不相同!這就是不可重復(fù)讀。

(2) 不可重復(fù)讀:指在自己的事務(wù)中讀取兩次,前后的數(shù)據(jù)不一樣

[[317490]]

第三天

事務(wù)A(蛇精)訪問(wèn)了數(shù)據(jù)庫(kù),她想要看看到底已經(jīng)誕生的葫蘆娃有哪些,于是她執(zhí)行了

  1. select * from T;   //查出一共有四條葫蘆娃信息 

這時(shí)候因?yàn)槲逋拚Q生了,所以事務(wù)B(爺爺)打開(kāi)了數(shù)據(jù)庫(kù)并將五娃的信息錄入

  1. insert into T values (5, '五','噴水'); 

這時(shí)候,事務(wù)A(蛇精)想要再查詢一次所有已誕生的葫蘆娃信息進(jìn)行確認(rèn),于是又執(zhí)行了查詢

  1. select * from T;   //查出一共有五條葫蘆娃信息 

這個(gè)時(shí)候事務(wù)A(蛇精)可能就會(huì)蒙了,以為自己產(chǎn)生了幻覺(jué)。這種情況就叫“幻讀。

(3) 幻讀:指在自己的事務(wù)中兩個(gè)連續(xù)的查找之間一個(gè)并發(fā)的修改事務(wù)修改了查詢的數(shù)據(jù)集,導(dǎo)致這兩個(gè)查詢返回了不同的結(jié)果(注:不可重復(fù)讀與幻讀很相似,不可重復(fù)讀的重點(diǎn)是修改,而幻讀的重點(diǎn)在于新增或者刪除)

[[317491]]

數(shù)據(jù)庫(kù)的隔離級(jí)別

想要避免以上的情況,我們可以通過(guò)設(shè)置數(shù)據(jù)庫(kù)的隔離級(jí)別(結(jié)合實(shí)際場(chǎng)景選擇最適合的級(jí)別)。一般數(shù)據(jù)庫(kù)都包括以下四種隔離級(jí)別:

  • 讀未提交(Read Uncommitted)
  • 讀提交(Read Committed)
  • 可重復(fù)讀(Repeated Read)
  • 串行化(Serializable)

[[317492]]

這里以MySQL為例,在MySQL中事務(wù)隔離級(jí)別分為以下四級(jí):

  • 0級(jí):TRANSACTION_READ_UNCOMMITTED 一切都可發(fā)生
  • 1級(jí):TRANSACTION_READ_COMMITTED--不可以發(fā)生臟讀,不可重復(fù)讀和幻讀可以發(fā)生
  • 2級(jí):TRANSACTION_REPEATABLE_READ--不可以發(fā)生臟讀和重復(fù)讀,可以發(fā)生幻讀
  • 3級(jí):TRANSACTION_SERIALIZABLE --都不可發(fā)生

(1) 讀未提交(TRANSACTION_READ_UNCOMMITTED)

讀未提交,指可以讀到未提交的內(nèi)容。因?yàn)檫@種隔離級(jí)別下查詢是不會(huì)加鎖的,所以可能會(huì)產(chǎn)生“臟讀”、“不可重復(fù)讀”、“幻讀”。在實(shí)際開(kāi)發(fā)中如無(wú)特殊情況基本是不會(huì)使用該隔離級(jí)別的。

(2) 讀提交(TRANSACTION_READ_COMMITTED)

讀提交,指只能讀到已經(jīng)提交了的內(nèi)容。這是最常用的一種隔離級(jí)別也是Oracle和SQLServer的默認(rèn)級(jí)別,該級(jí)別可以有效地避免臟讀。(注意:除非顯示加鎖如共享鎖、排他鎖,否則查詢是默認(rèn)不加鎖的。而區(qū)別于“讀未提交”,“讀提交”可避免臟讀的原因是采用了 “快照讀”)

(3) 可重復(fù)讀(TRANSACTION_REPEATABLE_READ)

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

(4) 串行化(TRANSACTION_SERIALIZABLE)

串行化是數(shù)據(jù)庫(kù)最高的隔離級(jí)別,這種級(jí)別下事務(wù)串行化一個(gè)一個(gè)排隊(duì)順序執(zhí)行,可避免臟讀、不可重復(fù)讀、幻讀。安全性高相應(yīng)的執(zhí)行效率低,性能開(kāi)銷(xiāo)也最大,在實(shí)際開(kāi)發(fā)中比較少用。

快照讀

數(shù)據(jù)庫(kù)讀分為:一致非鎖定讀、鎖定讀,上面提到“快照讀”也就是非鎖定讀。可簡(jiǎn)單理解為執(zhí)行SELECT語(yǔ)句的時(shí)候會(huì)生成一個(gè)快照。

[[317493]]

注意:不同事務(wù)隔離級(jí)別下,快照讀是存在區(qū)別的:

  • READ COMMITTED 隔離級(jí)別下,事務(wù)中每次讀取都會(huì)重新生成一個(gè)快照,所以每次快照都是最新的。因此事務(wù)中每次執(zhí)行SELECT也可以看到其它已commit事務(wù)所作的更改,因?yàn)樽x取的是快照所以有效地避免了臟讀的情況。而假設(shè)如果沒(méi)有“快照讀(一致非鎖定讀)”使用的是“鎖定讀”,那么當(dāng)一個(gè)更新的事務(wù)沒(méi)有提交時(shí),另一個(gè)對(duì)更新數(shù)據(jù)進(jìn)行查詢的事務(wù)會(huì)因?yàn)闊o(wú)法查詢而被阻塞,這種情況下并發(fā)能力及效率相對(duì)比較差。
  • REPEATED READ 隔離級(jí)別下,快照會(huì)在事務(wù)中第一次SELECT語(yǔ)句執(zhí)行時(shí)生成,只有在本事務(wù)中對(duì)數(shù)據(jù)進(jìn)行更改Update才會(huì)更新快照,因此,只有第一次SELECT之前其它已提交事務(wù)所作的更改可以看到。

總結(jié)

事務(wù)的隔離性指:事務(wù)間是相互獨(dú)立的,不會(huì)互相影響,既一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)的其他事務(wù)是隔離的。當(dāng)沒(méi)有進(jìn)行事務(wù)隔離時(shí)可能會(huì)出現(xiàn)臟讀、幻讀、不可重復(fù)讀等情況。通過(guò)結(jié)合實(shí)際情況設(shè)置合理的隔離級(jí)別可以有效地避免以上問(wèn)題。

數(shù)據(jù)庫(kù)中常見(jiàn)的四個(gè)隔離級(jí)別:讀未提交、讀提交、可重復(fù)讀和串行化,其中讀提交在實(shí)際開(kāi)發(fā)中是比較常用的。而在其中引出了一個(gè)“讀快照”的概念,要注意的是不同隔離級(jí)別下“讀快照”是存在區(qū)別的,通過(guò)使用“讀快照”使得在發(fā)生并發(fā)操作時(shí)效率有所提升。

責(zé)任編輯:趙寧寧 來(lái)源: 今日頭條
相關(guān)推薦

2023-10-11 08:09:53

事務(wù)隔離級(jí)別

2018-10-17 09:55:06

數(shù)據(jù)庫(kù)隔離級(jí)別MySQL

2018-07-17 10:58:45

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

2022-06-29 11:01:05

MySQL事務(wù)隔離級(jí)別

2025-02-08 12:05:44

MySQLMyISAMInnoDB

2023-02-02 07:06:10

2018-09-06 14:53:39

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

2018-12-19 16:46:38

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

2010-11-19 16:13:06

oracle事務(wù)隔離級(jí)

2018-07-20 11:10:21

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

2009-06-29 17:54:47

Spring事務(wù)隔離

2023-06-01 07:37:48

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

2025-01-13 13:12:54

2020-10-13 10:32:24

MySQL事務(wù)MVCC

2021-07-26 10:28:13

MySQL事務(wù)隔離

2024-04-26 09:17:20

MySQL事務(wù)隔離

2018-01-03 08:52:27

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

2021-08-04 13:19:42

MySQL 事務(wù)隔離

2021-12-27 09:20:13

事務(wù)模式隔離

2021-01-18 11:49:26

面試事務(wù)隔離
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 日日夜夜天天综合 | 日韩中文字幕在线不卡 | 国产欧美精品一区二区色综合 | 精品久久久久香蕉网 | 日本三级网址 | 欧美一区二区三区在线看 | av在线一区二区三区 | 成人在线精品视频 | 亚洲精品久久久久久久久久久久久 | 成年人在线观看 | 日韩一区和二区 | 日韩欧美在线观看一区 | 国产精品久久久久久久久 | 午夜网| 久草视频观看 | 精品一区二区在线看 | 粉嫩高清一区二区三区 | 成人在线中文 | 国产欧美视频一区二区三区 | 欧美理论在线观看 | 日韩欧美国产一区二区三区 | 羞羞视频网站免费观看 | 9porny九色视频自拍 | 最新国产精品 | 91精品国产日韩91久久久久久 | 亚洲成人免费 | 97色在线视频 | 99re在线| 日日夜夜天天 | 久久精品一级 | 99re在线视频精品 | 久久青 | av毛片| 成人欧美一区二区三区黑人孕妇 | 久久y| 一区二区三区不卡视频 | 久久久中文 | 欧美一区二区在线播放 | 日韩欧美精品一区 | 日本网站免费观看 | 亚洲欧美精品在线 |