6 事務(wù)
6.1 說(shuō)一下事務(wù)的ACID和隔離級(jí)別
1 講解了AID三個(gè)特性都是為了C(一致性)服務(wù)的。一般數(shù)據(jù)庫(kù)需要使用事務(wù)保證數(shù)據(jù)庫(kù)的一致性。
正確情況下最好詳細(xì)講講:
ACID是用來(lái)描述數(shù)據(jù)庫(kù)事務(wù)的四個(gè)關(guān)鍵特性的首字母縮寫,具體包括:
- 原子性(Atomicity):一個(gè)事務(wù)(transaction)必須被視為一個(gè)不可分割的最小工作單元,整個(gè)事務(wù)的所有操作要么全部提交成功,要么全部失敗回滾,對(duì)于一個(gè)事務(wù)來(lái)說(shuō),不能只執(zhí)行其中的一部分操作。
- 一致性(Consistency):事務(wù)應(yīng)確保數(shù)據(jù)庫(kù)從一個(gè)一致的狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€(gè)一致的狀態(tài)。一致性是指數(shù)據(jù)庫(kù)應(yīng)滿足預(yù)定的約束條件,如數(shù)據(jù)的完整性約束等。
- 隔離性(Isolation):多個(gè)并發(fā)事務(wù)之間需要隔離,以防止數(shù)據(jù)損壞。隔離性保證了一個(gè)事務(wù)在執(zhí)行過(guò)程中,其操作和產(chǎn)生的中間態(tài)對(duì)其他并發(fā)事務(wù)是隔離的,即一個(gè)事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)。
- 持久性(Durability):一旦事務(wù)提交,對(duì)數(shù)據(jù)的修改就是永久性的。即使出現(xiàn)系統(tǒng)故障,修改的數(shù)據(jù)也不會(huì)丟失。
這四個(gè)特性是數(shù)據(jù)庫(kù)事務(wù)所必需的,可以確保數(shù)據(jù)的一致性和可靠性。A、I、D三個(gè)特性可以看作是為了實(shí)現(xiàn)C(一致性)服務(wù)的。事務(wù)就是為了保證操作數(shù)據(jù)庫(kù)的完整性和一致性,這就是ACID的重要性。
2 在SQL標(biāo)準(zhǔn)中定義了四種隔離級(jí)別,分別是:.。。。
6.2 假設(shè)第一個(gè)線程開啟了一個(gè)事務(wù)在開始和快結(jié)束時(shí)分別讀取一次,但是中間第二個(gè)線程修改了其中的數(shù)據(jù),這個(gè)時(shí)候 第一個(gè)線程第二次讀取到的數(shù)據(jù)是線程二修改后的還是修改前的數(shù)據(jù)?(重要)
答:這個(gè)問(wèn)題的答案取決于你的數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別。
如果線程二的事務(wù)沒(méi)有提交:在讀未提交的隔離級(jí)別時(shí),可以讀取到數(shù)據(jù),但是在讀已提交、RR的級(jí)別下都不能讀取到線程二修改后的數(shù)據(jù),都只能讀取到修改前的數(shù)據(jù)。
如果線程二的事務(wù)提交了:此時(shí)不存在讀未提交的數(shù)據(jù)問(wèn)題,但是在讀已提交的隔離級(jí)別時(shí),可以讀取到修改后的數(shù)據(jù),但是在RR級(jí)別下讀取的是修改前的數(shù)據(jù)。
Serializable級(jí)別下,所有事務(wù)串行化執(zhí)行,如果第一個(gè)線程的事務(wù)先執(zhí)行,則全程只能讀取到修改前的數(shù)據(jù),等它執(zhí)行完了,線程二才能繼續(xù)執(zhí)行后續(xù)的修改操作。
也可以結(jié)合下面這個(gè)總結(jié)看一下:
- Read Uncommitted(未提交讀):在這個(gè)級(jí)別,一個(gè)事務(wù)可能會(huì)看到其他事務(wù)未提交的數(shù)據(jù)。所以在你的例子中,線程一第二次讀取到的數(shù)據(jù)將是線程二修改后的數(shù)據(jù)。
- Read Committed(提交讀):在這個(gè)級(jí)別,一個(gè)事務(wù)只能看到其他事務(wù)已經(jīng)提交的數(shù)據(jù)。在你的例子中,如果線程二在線程一第二次讀取之前已經(jīng)提交了事務(wù),那么線程一會(huì)讀取到線程二修改后的數(shù)據(jù)。如果線程二還沒(méi)有提交,那么線程一將讀取到線程二修改前的數(shù)據(jù)。
- Repeatable Read(可重復(fù)讀):在這個(gè)級(jí)別,一個(gè)事務(wù)在整個(gè)過(guò)程中看到的數(shù)據(jù)是一致的。也就是說(shuō),在事務(wù)開始后,不會(huì)再看到其他事務(wù)對(duì)數(shù)據(jù)的修改。在你的例子中,線程一第二次讀取到的數(shù)據(jù)將是線程二修改前的數(shù)據(jù),不論線程二是否已經(jīng)提交了事務(wù)。
- Serializable(可串行化):這是最嚴(yán)格的隔離級(jí)別,要求所有事務(wù)串行執(zhí)行。這種級(jí)別可以防止所有的并發(fā)問(wèn)題。
需要注意的是,隔離級(jí)別越高,數(shù)據(jù)的一致性越好,但是并發(fā)性能可能會(huì)降低。所以在實(shí)際的系統(tǒng)中需要根據(jù)實(shí)際的需求和性能要求來(lái)選擇合適的隔離級(jí)別。
6.3 mvcc的快照如何實(shí)現(xiàn)的
使用undo log日志,最近一個(gè)日志也就是快照,會(huì)被數(shù)據(jù)行的一個(gè)隱藏指針db_roll_ptr指向
6.4 寫sql
有一個(gè)teacher表,字段是id和name,還有一個(gè)t_s表,表示teacher-student,有字段tid,sid?,F(xiàn)在讓你查詢學(xué)生數(shù)大于10個(gè)的老師。
select t.name from teacher t left join t_s ts on t.id=ts.id group by t.id having count(ts.sid)>10
6.5 數(shù)據(jù)庫(kù)的隔離級(jí)別都是針對(duì)讀操作的嗎?
數(shù)據(jù)庫(kù)的隔離級(jí)別針對(duì)的不僅僅是讀操作,也包括寫操作。但往往我們更關(guān)注讀操作的一致性,因?yàn)樵诓l(fā)環(huán)境下,不同的隔離級(jí)別會(huì)對(duì)讀操作產(chǎn)生不同的影響,比如臟讀、不可重復(fù)讀和幻讀等問(wèn)題。而寫操作通常是由數(shù)據(jù)庫(kù)的并發(fā)控制機(jī)制(如鎖)來(lái)保證一致性的。
6.6 事務(wù)本身不能保證對(duì)寫的保護(hù),需要配合鎖一起完成
你是對(duì)的。事務(wù)只是提供了一種機(jī)制,確保由一組數(shù)據(jù)庫(kù)操作構(gòu)成的邏輯工作單元要么完全完成,要么完全不完成(這就是事務(wù)的原子性)。但事務(wù)本身并不能防止多個(gè)事務(wù)并發(fā)地修改同一份數(shù)據(jù),這可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。
為了解決這個(gè)問(wèn)題,數(shù)據(jù)庫(kù)系統(tǒng)通常會(huì)使用鎖等并發(fā)控制機(jī)制來(lái)防止并發(fā)事務(wù)之間的沖突。當(dāng)一個(gè)事務(wù)試圖修改一份數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)系統(tǒng)會(huì)給這份數(shù)據(jù)加鎖,防止其他事務(wù)同時(shí)修改這份數(shù)據(jù)。直到這個(gè)事務(wù)完成(提交或者回滾)并釋放鎖,其他的事務(wù)才能修改這份數(shù)據(jù)。
這就是為什么我們說(shuō)數(shù)據(jù)庫(kù)的隔離級(jí)別提供了對(duì)寫操作的保護(hù)。實(shí)際上,這種保護(hù)是由數(shù)據(jù)庫(kù)的并發(fā)控制機(jī)制(如鎖)來(lái)實(shí)現(xiàn)的,不同的隔離級(jí)別使用了不同的并發(fā)控制策略,因此提供了不同程度的寫操作保護(hù)。
6.6.1 如果個(gè)事務(wù)在可重復(fù)讀的情況下,第一次讀操作后,使用了update語(yǔ)句更新這個(gè)操作,這個(gè)時(shí)候會(huì)重新 生成一次readview嗎然后基于最新的數(shù)據(jù)進(jìn)行更新?
在可重復(fù)讀的隔離級(jí)別下,一次讀操作后如果使用了update語(yǔ)句更新這個(gè)操作,不會(huì)重新生成一次readview。在可重復(fù)讀的隔離級(jí)別下,事務(wù)在開始時(shí)生成一個(gè)快照,后續(xù)的操作都是在這個(gè)快照的基礎(chǔ)上進(jìn)行的。當(dāng)事務(wù)執(zhí)行update語(yǔ)句時(shí),會(huì)根據(jù)之前的快照進(jìn)行更新操作。即使有其他事務(wù)對(duì)這個(gè)數(shù)據(jù)進(jìn)行了修改,本事務(wù)看到的數(shù)據(jù)仍然是開始時(shí)生成快照時(shí)的數(shù)據(jù)。
6.6.2 mysql數(shù)據(jù)庫(kù)的事務(wù)的一致性范圍?
推薦:如何理解數(shù)據(jù)庫(kù)事務(wù)中的一致性的概念?
在這篇文章中,指明了事務(wù)的一致性受到數(shù)據(jù)庫(kù)的完整性和應(yīng)用層業(yè)務(wù)特性的完整性約束,其中并發(fā)約束也屬于應(yīng)用層業(yè)務(wù)約束的需要,所以mysql事務(wù)的一致性的粒度可以是單線程的一致性也可以是多線程下并發(fā)的一致性,這取決于業(yè)務(wù)需要,當(dāng)然一般的并發(fā)業(yè)務(wù)都需要確保這種并發(fā)一致性,所以就會(huì)用到鎖來(lái)解決超賣、幻讀等問(wèn)題,但是單線程的業(yè)務(wù)就不需要用到鎖了。
6.6.3 在RR級(jí)別下,前后兩次使用select語(yǔ)句查詢相關(guān)區(qū)間內(nèi)記錄跳數(shù),中間另外一個(gè)事務(wù)往這個(gè)區(qū)間插入了語(yǔ)句,第二次select這個(gè)區(qū)間數(shù)據(jù)會(huì)發(fā)現(xiàn)多一條嗎?
在RR(Repeatable Read)級(jí)別下,兩次使用SELECT語(yǔ)句查詢相同的記錄集應(yīng)該返回相同的結(jié)果,即使在兩次查詢之間有其他事務(wù)往這個(gè)區(qū)間插入了記錄。因?yàn)樵赗R隔離級(jí)別下,事務(wù)在開始時(shí)會(huì)創(chuàng)建一個(gè)數(shù)據(jù)快照(read view),后續(xù)的讀操作都是基于這個(gè)快照進(jìn)行的,不會(huì)看到在事務(wù)開始后其他事務(wù)所做的修改。因此,如果在事務(wù)開始后其他事務(wù)插入了新記錄,當(dāng)前事務(wù)在后續(xù)的查詢中是看不到這些新記錄的。
要注意的是,盡管RR級(jí)別可以保證已有的記錄在事務(wù)期間保持一致性,但它并不能阻止其他事務(wù)插入新的記錄。當(dāng)當(dāng)前事務(wù)提交后,這些在事務(wù)期間插入的新記錄就會(huì)變得可見。
這也是RR隔離級(jí)別無(wú)法完全避免幻讀(phantom read)的原因。幻讀是指在某一個(gè)事務(wù)提交之后,一個(gè)查詢的結(jié)果集突然出現(xiàn)或消失。在RR級(jí)別下,事務(wù)不會(huì)看到其他事務(wù)插入的新行,但當(dāng)事務(wù)提交后,這些新行會(huì)變得可見,這就可能導(dǎo)致幻讀。
7 串行化相關(guān)問(wèn)題
7.1 串行化一定能保證讀取的數(shù)據(jù)是最新的對(duì)吧
是的,串行化是數(shù)據(jù)庫(kù)隔離級(jí)別中最高的級(jí)別,它可以保證事務(wù)串行執(zhí)行,從而避免并發(fā)執(zhí)行的事務(wù)產(chǎn)生的各種問(wèn)題,包括讀取的數(shù)據(jù)不是最新的問(wèn)題。在串行化級(jí)別下,事務(wù)的執(zhí)行結(jié)果和它們串行執(zhí)行的結(jié)果一致。
7.2 串行化的事務(wù)是數(shù)據(jù)庫(kù)中的所有事物嗎還是某一張表的關(guān)聯(lián)事務(wù),串行化的粒度有多大
串行化的粒度取決于具體的數(shù)據(jù)庫(kù)管理系統(tǒng)和它的并發(fā)控制機(jī)制。在一些數(shù)據(jù)庫(kù)系統(tǒng)中,串行化可能會(huì)鎖定整個(gè)數(shù)據(jù)庫(kù),使得所有的事務(wù)都必須串行執(zhí)行。在其他一些數(shù)據(jù)庫(kù)系統(tǒng)中,串行化可能只會(huì)鎖定被事務(wù)訪問(wèn)的數(shù)據(jù),使得訪問(wèn)不同數(shù)據(jù)的事務(wù)可以并行執(zhí)行。
mysql中串行化的粒度有多大?
MySQL中的串行化(SERIALIZABLE)隔離級(jí)別會(huì)對(duì)所有的讀操作都加鎖,以防止其他事務(wù)并發(fā)修改數(shù)據(jù),從而實(shí)現(xiàn)事務(wù)的串行執(zhí)行。這意味著在同一時(shí)間只有一個(gè)事務(wù)能夠?qū)ν环輸?shù)據(jù)進(jìn)行操作。所以可以說(shuō),MySQL的串行化隔離級(jí)別在數(shù)據(jù)行級(jí)別上進(jìn)行的,具體的粒度取決于事務(wù)操作的數(shù)據(jù)范圍。
7.3 串行化機(jī)制是不是也可以在客戶端實(shí)現(xiàn),比如消息隊(duì)列單線程消費(fèi)的場(chǎng)景
是的,串行化機(jī)制并不局限于數(shù)據(jù)庫(kù),它可以應(yīng)用在任何需要并發(fā)控制的場(chǎng)景。比如在消息隊(duì)列中,你可以讓每個(gè)消費(fèi)者線程處理一部分消息,使得不同的消費(fèi)者線程處理的消息不會(huì)有交集,這樣就可以達(dá)到類似于串行化的效果。但需要注意的是,這種方法依賴于消息的分配策略,如果消息不能均勻地分配給每個(gè)消費(fèi)者線程,那么消費(fèi)者線程可能會(huì)出現(xiàn)空閑,導(dǎo)致系統(tǒng)的吞吐量下降。
8 數(shù)據(jù)庫(kù)事物有哪些特性,分別是由什么進(jìn)行保證和實(shí)現(xiàn)?(字節(jié)后端一面)
8.1 數(shù)據(jù)庫(kù)事務(wù)具有以下四個(gè)關(guān)鍵特性,通常稱為ACID特性:
-
原子性(Atomicity):原子性確保事務(wù)是一個(gè)不可分割的操作單元,要么全部執(zhí)行,要么全部不執(zhí)行。如果一個(gè)事務(wù)中的任何一部分失敗,整個(gè)事務(wù)將被回滾到初始狀態(tài),以確保數(shù)據(jù)的一致性。原子性通常由數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)來(lái)實(shí)現(xiàn),使用事務(wù)日志和回滾機(jī)制來(lái)確保。
-
一致性(Consistency):一致性確保事務(wù)將數(shù)據(jù)庫(kù)從一個(gè)一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€(gè)一致狀態(tài)。這意味著事務(wù)執(zhí)行前后數(shù)據(jù)庫(kù)必須滿足一定的完整性約束和規(guī)則,以確保數(shù)據(jù)的完整性。一致性通常由應(yīng)用程序和數(shù)據(jù)庫(kù)約束來(lái)保證。
-
隔離性(Isolation):隔離性確保同時(shí)運(yùn)行多個(gè)事務(wù)時(shí),每個(gè)事務(wù)都感覺(jué)就像它是唯一運(yùn)行的,不會(huì)受到其他事務(wù)的影響。隔離性通過(guò)使用鎖定機(jī)制、多版本控制或其他并發(fā)控制技術(shù)來(lái)實(shí)現(xiàn),以防止數(shù)據(jù)競(jìng)爭(zhēng)和不一致的讀取。
-
持久性(Durability):持久性確保一旦事務(wù)成功提交,其結(jié)果將永久保存在數(shù)據(jù)庫(kù)中,即使系統(tǒng)崩潰或斷電也不會(huì)丟失。持久性通常通過(guò)將事務(wù)日志寫入非易失性存儲(chǔ)(如硬盤)來(lái)實(shí)現(xiàn)。
8.2 四大特性的實(shí)現(xiàn)
這些ACID特性共同確保了事務(wù)的可靠性和數(shù)據(jù)完整性。在數(shù)據(jù)庫(kù)管理系統(tǒng)內(nèi)部,使用日志記錄和恢復(fù)機(jī)制來(lái)實(shí)現(xiàn)這些特性。具體實(shí)現(xiàn)方法可以有所不同,但通常涉及以下步驟:
-
事務(wù)日志(Transaction Log):數(shù)據(jù)庫(kù)將事務(wù)的所有更改(插入、更新、刪除)記錄到事務(wù)日志中,以便在需要時(shí)進(jìn)行恢復(fù)。這包括在提交事務(wù)之前記錄所有更改,以確保原子性和持久性。
-
并發(fā)控制(Concurrency Control):為了實(shí)現(xiàn)隔離性,數(shù)據(jù)庫(kù)管理系統(tǒng)使用鎖定、時(shí)間戳或多版本控制等技術(shù)來(lái)管理同時(shí)運(yùn)行的事務(wù)。這確保了每個(gè)事務(wù)不會(huì)干擾其他事務(wù)的操作。
-
回滾(Rollback):如果事務(wù)中的任何一部分失敗或發(fā)生錯(cuò)誤,數(shù)據(jù)庫(kù)系統(tǒng)將使用事務(wù)日志中的信息將事務(wù)回滾到之前的狀態(tài),以確保原子性。
-
持久性保證(Durability Guarantee):數(shù)據(jù)庫(kù)管理系統(tǒng)確保將事務(wù)日志中的更改寫入持久性存儲(chǔ),如硬盤。這確保了即使系統(tǒng)崩潰或斷電,事務(wù)的結(jié)果也不會(huì)丟失。
總之,ACID特性是數(shù)據(jù)庫(kù)事務(wù)的關(guān)鍵特性,通過(guò)數(shù)據(jù)庫(kù)管理系統(tǒng)的內(nèi)部機(jī)制和恢復(fù)策略來(lái)實(shí)現(xiàn)和保證。這些特性確保了數(shù)據(jù)的可靠性和完整性,使數(shù)據(jù)庫(kù)在面臨各種故障和并發(fā)訪問(wèn)時(shí)仍然能夠保持一致性。
8.3 undo log、redo log以及bin log日志對(duì)事務(wù)的ACID的保證?
8.4 數(shù)據(jù)庫(kù)隔離級(jí)別:
數(shù)據(jù)庫(kù)隔離級(jí)別定義了不同事務(wù)之間的可見性和互操作性。SQL標(biāo)準(zhǔn)定義了四個(gè)隔離級(jí)別,從最低到最高分別是Read Uncommitted、Read Committed、Repeatable Read和Serializable。
-
Read Uncommitted:允許一個(gè)事務(wù)讀取另一個(gè)事務(wù)未提交的修改,是最低的隔離級(jí)別,通常不建議使用,因?yàn)榭赡軐?dǎo)致臟讀和不可重復(fù)讀。
-
Read Committed:保證一個(gè)事務(wù)不會(huì)讀取到另一個(gè)未提交事務(wù)的修改。這是大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)隔離級(jí)別。
-
Repeatable Read:確保一個(gè)事務(wù)在執(zhí)行期間看到的數(shù)據(jù)保持一致,即使其他事務(wù)在此期間進(jìn)行了插入或修改。這是MySQL的默認(rèn)隔離級(jí)別。
-
Serializable:提供最高的隔離級(jí)別,確保事務(wù)之間不存在并發(fā)問(wèn)題,但性能通常較低。
8.5 RC和RR隔離級(jí)別的MVCC機(jī)制區(qū)別:
-
RC(Read Committed)隔離級(jí)別:在RC隔離級(jí)別下,事務(wù)可以讀取已提交事務(wù)的數(shù)據(jù),但不能讀取未提交事務(wù)的數(shù)據(jù)。MVCC通過(guò)在內(nèi)部為每個(gè)事務(wù)創(chuàng)建快照來(lái)實(shí)現(xiàn)這一點(diǎn),以確保一個(gè)事務(wù)不會(huì)讀取到另一個(gè)事務(wù)未提交的修改。
-
RR(Repeatable Read)隔離級(jí)別:在RR隔離級(jí)別下,事務(wù)可以讀取已提交事務(wù)的數(shù)據(jù),并且在整個(gè)事務(wù)期間都不會(huì)看到其他事務(wù)的插入、更新或刪除操作的結(jié)果。MVCC也在這里發(fā)揮作用,但它在事務(wù)開始時(shí)創(chuàng)建快照,并在整個(gè)事務(wù)期間保持不變,以確保數(shù)據(jù)的一致性。
8.6 在RR隔離級(jí)別下避免幻讀(MVCC + Next-Key Locking):
幻讀是指在一個(gè)事務(wù)中執(zhí)行相同的查詢,但由于其他事務(wù)插入或刪除了符合查詢條件的行,導(dǎo)致結(jié)果集不一致的情況。在RR隔離級(jí)別下,為了避免幻讀,數(shù)據(jù)庫(kù)使用MVCC和Next-Key Locking機(jī)制來(lái)處理。
-
MVCC:MVCC通過(guò)創(chuàng)建事務(wù)的快照來(lái)確保查詢不受其他事務(wù)的影響。在RR隔離級(jí)別下,查詢會(huì)使用事務(wù)開始時(shí)的快照,這意味著在查詢期間其他事務(wù)的插入、更新和刪除不會(huì)影響查詢結(jié)果。
-
Next-Key Locking:Next-Key Locking是一種鎖機(jī)制,它在RR隔離級(jí)別下用于避免幻讀。當(dāng)一個(gè)事務(wù)執(zhí)行SELECT語(yǔ)句時(shí),Next-Key Locking會(huì)鎖定查詢范圍內(nèi)的所有記錄,并且還會(huì)鎖定可能在查詢之后被插入的記錄的"間隙",以防止幻讀。這確保了在查詢期間其他事務(wù)無(wú)法插入滿足查詢條件的新記錄。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-678699.html
綜上所述,在RR隔離級(jí)別下,通過(guò)MVCC和Next-Key Locking機(jī)制,數(shù)據(jù)庫(kù)確保了查詢的一致性和避免了幻讀問(wèn)題。MVCC提供了快照來(lái)保持查詢的一致性,而Next-Key Locking則確保了查詢期間的數(shù)據(jù)不會(huì)受到其他事務(wù)的插入操作的干擾。這兩個(gè)機(jī)制結(jié)合起來(lái),為RR隔離級(jí)別下的數(shù)據(jù)一致性提供了保障。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-678699.html
8.7 只使用 Next-Key Locking,能保證避免幻讀嘛, Next-key不是會(huì)鎖住間隙和行嘛,是行鎖和間隙鎖的結(jié)合,這樣應(yīng)該不允許其他事務(wù)修改了吧,然后是不是就能保證幻讀了?但是能保證可重復(fù)讀嘛?
8.8
到了這里,關(guān)于mysql基礎(chǔ)面經(jīng)之三:事務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!