《數(shù)據(jù)庫(kù)原理及應(yīng)用》第2版 課件 第11章 事務(wù)及其并發(fā)控制_第1頁(yè)
《數(shù)據(jù)庫(kù)原理及應(yīng)用》第2版 課件 第11章 事務(wù)及其并發(fā)控制_第2頁(yè)
《數(shù)據(jù)庫(kù)原理及應(yīng)用》第2版 課件 第11章 事務(wù)及其并發(fā)控制_第3頁(yè)
《數(shù)據(jù)庫(kù)原理及應(yīng)用》第2版 課件 第11章 事務(wù)及其并發(fā)控制_第4頁(yè)
《數(shù)據(jù)庫(kù)原理及應(yīng)用》第2版 課件 第11章 事務(wù)及其并發(fā)控制_第5頁(yè)
已閱讀5頁(yè),還剩50頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

《數(shù)據(jù)庫(kù)原理及應(yīng)用》數(shù)據(jù)庫(kù)虛擬教研室制作數(shù)據(jù)庫(kù)目錄01

數(shù)據(jù)一致性問(wèn)題02事務(wù)概念03JDBC事務(wù)04事務(wù)的特性05事務(wù)的并發(fā)問(wèn)題06事務(wù)的隔離級(jí)別07事務(wù)并發(fā)控制第11講事務(wù)及其并發(fā)控制數(shù)據(jù)一致性問(wèn)題數(shù)據(jù)一致性是指關(guān)聯(lián)數(shù)據(jù)之間的邏輯關(guān)系是否正確和完整,當(dāng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)從一個(gè)狀態(tài)轉(zhuǎn)變到另一個(gè)狀態(tài)時(shí),要能保證數(shù)據(jù)前后的一致性。數(shù)據(jù)庫(kù)系統(tǒng)中的一系列約束可以解決部分一致性需求,如主鍵約束、外鍵約束、唯一約束、非空約束和檢查約束等。在數(shù)據(jù)庫(kù)中,一個(gè)動(dòng)作是指一個(gè)增、刪、改語(yǔ)句,當(dāng)有多個(gè)動(dòng)作去完成一個(gè)任務(wù)時(shí)(如銀行轉(zhuǎn)帳),如果不加約束就可能產(chǎn)生數(shù)據(jù)不一致性問(wèn)題。數(shù)據(jù)不一致性舉例

【例】:銀行財(cái)務(wù)轉(zhuǎn)賬,A賬戶轉(zhuǎn)600元到B賬戶。A賬戶B賬戶600400160010001000A賬戶B賬戶60040022004001600第一次轉(zhuǎn)帳第二次轉(zhuǎn)帳數(shù)據(jù)不一致性舉例DELIMITER$$CREATEPROCEDUREp_transfer(INfrom_accountINT,INto_accountINT,INamountDECIMAL(10,2))BEGINUPDATEaccountSETbalance=balance+amountWHEREaccount_id=to_account;UPDATEaccountSETbalance=balance-amountWHEREaccount_id=from_account;END$$

CREATETABLEaccount(account_idINTUNSIGNEDPRIMARYKEYAUTO_INCREMENT,account_nameVARCHAR(20)NOTNULL,balanceDECIMAL(10,2)DEFAULT'0.00'CHECK(balance>=0))AUTO_INCREMENT=202201;

【例11.1】某銀行數(shù)據(jù)庫(kù)(bank)中的賬戶表(account),其中賬戶余額(balance)字段值不能為負(fù)數(shù)。要求設(shè)計(jì)一個(gè)存儲(chǔ)過(guò)程p_transfer用于不同客戶間的轉(zhuǎn)賬交易,以保證賬戶數(shù)據(jù)的一致性。事務(wù)概念事務(wù)(Transaction)是指一個(gè)動(dòng)作或一系列動(dòng)作的組合,這些動(dòng)作被當(dāng)作一個(gè)整體或一個(gè)邏輯單元來(lái)處理,這些動(dòng)作要么都執(zhí)行,要么都不執(zhí)行。系統(tǒng)變量AUTOCOMMIT控制事務(wù)的提交方式,ON為自動(dòng)提交,即每執(zhí)行完一個(gè)動(dòng)作(一個(gè)動(dòng)作開啟一個(gè)事務(wù)),系統(tǒng)自動(dòng)提交;OFF為手動(dòng)提交,即必須用COMMIT或ROLLBACK結(jié)束當(dāng)前事務(wù),開始事務(wù):使用BEGIN或STARTTRANSACTION命令開啟事務(wù)。提交事務(wù)(COMMIT):這些動(dòng)作全部成功地執(zhí)行,即此時(shí)整個(gè)活動(dòng)序列的所有執(zhí)行結(jié)果都被保存到數(shù)據(jù)庫(kù)中。回滾事務(wù)(ROLLBACK):這些動(dòng)作都不執(zhí)行并恢復(fù)到執(zhí)行前的狀態(tài)。解決數(shù)據(jù)不一致性舉例DELIMITER$$DROPPROCEDUREIFEXISTSp_transfer$$CREATEPROCEDUREp_transfer(INfrom_accountINT,INto_accountINT,INamountDECIMAL(10,2))BEGINDECLAREEXITHANDLERFORSQLEXCEPTIONROLLBACK;STARTTRANSACTION;UPDATEaccountSETbalance=balance+amountWHEREaccount_id=to_account;UPDATEaccountSETbalance=balance-amountWHEREaccount_id=from_account;COMMIT;END$$

【例11.2】采用MySQL中的事務(wù)解決【例11.1】中的轉(zhuǎn)賬問(wèn)題,即在存儲(chǔ)過(guò)程p_transfer中加入事務(wù)控制。事務(wù)的提交與回退【例11.3】:只撤消事務(wù)的一部分updateaccountsetbalance=balance-10000whereaccountID='A';savepointt;updateaccountsetbalance=balance+10000whereaccountID='B';rollbacktot;ROLLBACK說(shuō)明:

在尚未對(duì)數(shù)據(jù)庫(kù)提交的時(shí)候,可以用事務(wù)回退命令ROLLBACK,將數(shù)據(jù)庫(kù)回退到上次COMMIT后的狀態(tài)。一旦事務(wù)已經(jīng)提交,就不能再使用事務(wù)回退命令進(jìn)行回退了。事務(wù)回退將回退整個(gè)事務(wù),如果只需回退事務(wù)的一部分時(shí),可以使用保存點(diǎn),將整個(gè)事務(wù)劃分為若干部分,這樣就可以回退部分事務(wù)了。JDBC事務(wù)

實(shí)際上,一個(gè)Java應(yīng)用系統(tǒng),通常分前端與后端兩個(gè)部分,前端和后端都可以實(shí)現(xiàn)事務(wù)管理,應(yīng)用系統(tǒng)對(duì)事務(wù)的控制通常放在前端來(lái)實(shí)現(xiàn)。如果前端使用JAVA編程,前端事務(wù)就稱為JDBC事務(wù)。數(shù)據(jù)庫(kù)客戶端工具(SQLyog)DBA數(shù)據(jù)庫(kù)開發(fā)工具(Java)程序員JDBCmysql存儲(chǔ)過(guò)程JDBC事務(wù)JDBCConnection接口提供了相應(yīng)的方法來(lái)管理事務(wù):publicvoidsetAutoCommit(boolean)//設(shè)置提交方式publicbooleangetAutoCommit()//獲取當(dāng)前的提交方式publicvoidcommit()//提交publicvoidrollback()//回滾JDBC事務(wù)

【例11.4】:用JDBC事務(wù)來(lái)實(shí)現(xiàn)銀行財(cái)務(wù)轉(zhuǎn)賬。try{conn.setAutoCommit(false);stmt=conn.createStatement();Stringsql1="updateaccountsetbalance=balance-600whereaccount_id=202201";stmt.executeUpdate(sql1);Stringsql2="updateaccountsetbalance=balance+600whereaccount_id=202202";stmt.executeUpdate(sql2);

mit();}catch(SQLExceptione){ e.printStackTrace();try{

conn.rollback();}} JDBC事務(wù)思考題:在數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中,事務(wù)處理放在前端和后端,哪個(gè)更好?答:從數(shù)據(jù)庫(kù)系統(tǒng)的可移植性來(lái)說(shuō),放在前端比放在后端好。因?yàn)楹蠖艘话阃ㄟ^(guò)數(shù)據(jù)庫(kù)編程來(lái)進(jìn)行控制,而不同工具如MySQL、SQLServer、Orale等編程語(yǔ)法差別較大,可移植性差。事務(wù)的特性①原子性(Atomicity):事務(wù)是一個(gè)不可分隔的整體,事務(wù)中的語(yǔ)句要么都執(zhí)行,要么都不執(zhí)行;②一致性(Consistency):事務(wù)執(zhí)行的結(jié)果必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變?yōu)榱硗庖粋€(gè)一致性狀態(tài);③隔離性(Isolation):指并發(fā)事務(wù)之間的干擾性,有具體的隔離級(jí)別決定;④持續(xù)性(Durability):事務(wù)對(duì)數(shù)據(jù)庫(kù)的更改是永久的,能夠保證已經(jīng)成功提交的事務(wù)持久化到磁盤中。事務(wù)并發(fā)引發(fā)的數(shù)據(jù)不一致性并發(fā)操作:在多用戶共享系統(tǒng)中,如果多個(gè)用戶同時(shí)對(duì)同一個(gè)數(shù)據(jù)進(jìn)行操作,稱為多事務(wù)并發(fā)操作。A事務(wù)B事務(wù)(1)丟失更新(3)不可重復(fù)讀(2)讀“臟”數(shù)據(jù)(4)幻讀事務(wù)并發(fā)引發(fā)的數(shù)據(jù)不一致性(1)丟失更新事務(wù)并發(fā)引發(fā)的數(shù)據(jù)不一致性(2)讀“臟”數(shù)據(jù)事務(wù)的并發(fā)引發(fā)的數(shù)據(jù)不一致性(3)不可重復(fù)讀事務(wù)并發(fā)引發(fā)的數(shù)據(jù)不一致性(4)幻讀事務(wù)隔離級(jí)別事務(wù)隔離級(jí)別(TransactionIsolationLevel):指一個(gè)事務(wù)對(duì)并行的另一個(gè)事務(wù)的隔離程度。為避免并發(fā)事務(wù)執(zhí)行中可能出現(xiàn)丟失更新、臟讀、不可重復(fù)讀和幻讀等現(xiàn)象,數(shù)據(jù)庫(kù)系統(tǒng)提供了不同級(jí)別的事務(wù)隔離,防止事務(wù)之間的相互影響:(1)讀未提交(READUNCOMMITTED);(2)讀已提交(READCOMMITTED);(3)可重復(fù)讀(REPEATABLEREAD);(4)串行化(SERIALIZBALE)。設(shè)置事務(wù)隔離級(jí)別:SET[GLOBAL|SESSION]TRANSACTIONISOLATIONLEVEL事務(wù)隔離級(jí)別舉例--創(chuàng)建u1,u2兩個(gè)用戶CREATEUSERu1IDENTIFIEDBY'u1';CREATEUSERu2IDENTIFIEDBY'u2';--修改兩個(gè)用戶的加密插件ALTERUSERu1IDENTIFIEDWITH'mysql_native_password'BY'u1';--給兩個(gè)用戶授予bank.account操作的所有權(quán)限GRANTALLPRIVILEGESONbank.accountTOu1;GRANTALLPRIVILEGESONbank.accountTOu2;--用這兩個(gè)用戶創(chuàng)建兩個(gè)新連接創(chuàng)建兩個(gè)新用戶,并創(chuàng)建兩個(gè)新連接,為模擬并發(fā)事務(wù)做好準(zhǔn)備工作?!纠?1.5】account表中A賬戶的余額初值設(shè)為1000。事務(wù)T2的隔離級(jí)別設(shè)置為讀未提交,開啟兩個(gè)事務(wù),按表中的時(shí)間順序執(zhí)行語(yǔ)句,觀察事務(wù)T2兩次讀取的余額。事務(wù)隔離級(jí)別舉例【例11.6】account表中A賬戶的余額初值設(shè)為100。事務(wù)T2的隔離級(jí)別設(shè)置為讀已提交,開啟兩個(gè)事務(wù),按表中的時(shí)間順序執(zhí)行語(yǔ)句,觀察事務(wù)T2兩次讀取的余額。事務(wù)隔離級(jí)別舉例【例11.7】account表中A賬戶的余額初值設(shè)為100。事務(wù)T2的隔離級(jí)別設(shè)置為可重復(fù)讀,開啟兩個(gè)事務(wù),按表中的時(shí)間順序執(zhí)行語(yǔ)句,觀察事務(wù)T2兩次讀取的余額。事務(wù)隔離級(jí)別舉例【例11.8】account表中A賬戶的余額初值設(shè)為100。事務(wù)T2的隔離級(jí)別設(shè)置為可重復(fù)讀,開啟兩個(gè)事務(wù),按表中的時(shí)間順序執(zhí)行語(yǔ)句,觀察事務(wù)T2兩次讀取的記錄。事務(wù)隔離級(jí)別舉例【例11.9】account表中A賬戶的余額初值設(shè)為100。事務(wù)T2的隔離級(jí)別設(shè)置為串行化,開啟兩個(gè)事務(wù),按表中的時(shí)間順序執(zhí)行語(yǔ)句,觀察事務(wù)T2讀取的記錄。事務(wù)隔離級(jí)別舉例事務(wù)隔離級(jí)別與數(shù)據(jù)不一致性事務(wù)隔離級(jí)別思考題:不同的事務(wù)隔離級(jí)別在數(shù)據(jù)庫(kù)系統(tǒng)該如何選擇?答:數(shù)據(jù)庫(kù)管理系統(tǒng)一般都把事務(wù)的隔離級(jí)別設(shè)置為ReadCommitted;MySQL使用ReadCommited隔離級(jí)別進(jìn)行主從復(fù)制時(shí)會(huì)出現(xiàn)數(shù)據(jù)不一致問(wèn)題,因此MySQL將RepeatableRead作為默認(rèn)的隔離級(jí)別。事務(wù)并發(fā)控制事務(wù)的并發(fā)控制是指在數(shù)據(jù)庫(kù)管理系統(tǒng)中,為了保證多個(gè)事務(wù)同時(shí)執(zhí)行時(shí)數(shù)據(jù)的一致性和完整性而采取的技術(shù)手段,使用不同的隔離級(jí)別來(lái)控制,實(shí)現(xiàn)這些隔離級(jí)別的主要技術(shù)手段包括封鎖機(jī)制、多版本并發(fā)控制等。封鎖:封鎖是最傳統(tǒng)的也是最廣泛使用的并發(fā)控制技術(shù)。它通過(guò)在數(shù)據(jù)項(xiàng)上加鎖來(lái)控制事務(wù)對(duì)數(shù)據(jù)的訪問(wèn),確保事務(wù)的隔離性。多版本并發(fā)控制:通過(guò)維護(hù)數(shù)據(jù)的多個(gè)版本來(lái)實(shí)現(xiàn)并發(fā)控制,每個(gè)事務(wù)看到的是一個(gè)特定時(shí)間點(diǎn)的數(shù)據(jù)快照。封鎖封鎖機(jī)制用于管理對(duì)共享資源的并發(fā)訪問(wèn),實(shí)現(xiàn)數(shù)據(jù)的完整性和一致性。他是數(shù)據(jù)庫(kù)系統(tǒng)區(qū)別于文件系統(tǒng)的一個(gè)關(guān)鍵特性。數(shù)據(jù)庫(kù)系統(tǒng)中常見的鎖按照封鎖粒度劃分為:表級(jí)鎖、頁(yè)級(jí)鎖、行級(jí)鎖。(1)表級(jí)和頁(yè)級(jí)鎖的主要特點(diǎn):開銷小、加鎖快,不會(huì)出現(xiàn)死鎖,但由于其封鎖粒度大,發(fā)生鎖沖突的概率較高,抗并發(fā)能力較弱。(2)行級(jí)鎖的主要特點(diǎn):開銷大、加鎖慢,會(huì)出現(xiàn)死鎖,但由于其封鎖粒度小,發(fā)生鎖沖突的概率較低,抗并發(fā)能力較強(qiáng)。行鎖又分為讀鎖和寫鎖。行鎖讀鎖,又稱共享鎖(SharedLock,S鎖):封鎖粒度是一行或多行,多個(gè)不同的事務(wù)對(duì)同一個(gè)資源可加多個(gè)S鎖。如果事務(wù)T1對(duì)記錄R加上了S鎖,則執(zhí)行原則如下:①其他事務(wù)只能對(duì)記錄R加S鎖,不能再加其他鎖;②對(duì)于被加上S鎖的數(shù)據(jù),用戶只能進(jìn)行讀操作,不能進(jìn)行寫操作;③如果要修改數(shù)據(jù),必須等S鎖釋放。設(shè)置S鎖的語(yǔ)法格式:SELECT字段名列表FROM表名WHERE條件LOCKINSHAREMODE;行鎖【例11.10】以賬戶表account表為例,事務(wù)T1、T2同時(shí)對(duì)記錄“A”加S鎖,按表11.7中的時(shí)間順序執(zhí)行語(yǔ)句,驗(yàn)證S鎖的執(zhí)行原則。行鎖寫鎖,又稱排他鎖(ExclusiveLock,X鎖):封鎖粒度是一行或者多行。如果事務(wù)T1對(duì)記錄R加上了X鎖,則執(zhí)行原則如下:①事務(wù)T1可以對(duì)記錄R進(jìn)行讀操作和寫操作;②其他事務(wù)不能對(duì)記錄R施加任何類型的鎖,而且無(wú)法進(jìn)行增加、刪除、修改操作,直到事務(wù)T1對(duì)記錄R加的X鎖被釋放操作;設(shè)置X鎖的語(yǔ)法格式:SELECT字段名列表FROM表名WHERE條件FORUPDATE;行鎖【例11.11】以賬戶表account表為例,事務(wù)T1對(duì)記錄“A”加X鎖,事務(wù)T2對(duì)記錄“A”加S鎖,然后事務(wù)T1修改該記錄。按表中的時(shí)間順序執(zhí)行語(yǔ)句,驗(yàn)證S鎖的執(zhí)行原則。封鎖協(xié)議多個(gè)事務(wù)并發(fā)執(zhí)行,若不加控制,可能會(huì)產(chǎn)生數(shù)據(jù)不一致性問(wèn)題。為了解決這些問(wèn)題,在運(yùn)用X鎖和S鎖對(duì)數(shù)據(jù)對(duì)象加鎖時(shí),還需要約定一些規(guī)則。例如,何時(shí)申請(qǐng)X鎖或S鎖、持鎖時(shí)間、何時(shí)釋放等,這些規(guī)則稱為封鎖協(xié)議,下面介紹三級(jí)封鎖協(xié)議:一級(jí)封鎖協(xié)議:事務(wù)T在更新數(shù)據(jù)R之前必須先對(duì)其加X鎖,直到事務(wù)結(jié)束才釋放。一級(jí)封鎖協(xié)議可防止“丟失更新”。為了說(shuō)明方便,做如下約定:使用LockX(A)表示對(duì)數(shù)據(jù)對(duì)象A加X鎖,使用LockS(A)表示對(duì)數(shù)據(jù)對(duì)象A加S鎖,使用Unlock(A)表示釋放數(shù)據(jù)對(duì)象A上的封鎖,使用Read(A)表示讀取數(shù)據(jù)對(duì)象A的值,使用Update(A)表示更新數(shù)據(jù)對(duì)象A的值。封鎖協(xié)議【例11.12】以賬戶表account表為例,事務(wù)T1、T2同時(shí)對(duì)記錄A的余額(balance=1000)進(jìn)行更新,使用一級(jí)封鎖協(xié)議防止“丟失更新”。封鎖協(xié)議二級(jí)封鎖協(xié)議是指在一級(jí)封鎖協(xié)議的基礎(chǔ)上,增加事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,讀完后即可釋放S鎖。二級(jí)封鎖協(xié)議除了防止“丟失更新”,還可進(jìn)一步防止“臟讀”?!纠?1.13】以賬戶表account表為例,事務(wù)T1對(duì)記錄A的余額進(jìn)行更新,然后再撤銷,事務(wù)T2對(duì)讀取記錄A的余額,使用二級(jí)封鎖協(xié)議防止“臟讀”。封鎖協(xié)議三級(jí)封鎖協(xié)議是指在一級(jí)封鎖協(xié)議的基礎(chǔ)上,增加事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,直到事務(wù)結(jié)束才釋放。三級(jí)封鎖協(xié)議除了防止“丟失更新”和“臟讀”外,還進(jìn)一步防止了“不可重復(fù)讀”?!纠?1.14】以賬戶表account表為例,事務(wù)T1對(duì)記錄A的余額進(jìn)行更新,然后再撤銷,事務(wù)T2讀取記錄A的余額,使用三級(jí)封鎖協(xié)議可進(jìn)一步防止“不可重復(fù)讀”。封鎖協(xié)議在三級(jí)封鎖協(xié)議中,不能避免事務(wù)在表中插入記錄,所以它可能會(huì)出現(xiàn)“幻讀”。上述三級(jí)封鎖協(xié)議的主要區(qū)別在于分別約定了什么操作需要申請(qǐng)封鎖,以及何時(shí)釋放鎖。三級(jí)封鎖協(xié)議使事務(wù)達(dá)到的一致性級(jí)別是不同的,不同封鎖協(xié)議所對(duì)應(yīng)的事務(wù)隔離級(jí)別也不同。MVCC機(jī)制問(wèn)題:封鎖機(jī)制在并發(fā)控制中的效率如何?

封鎖機(jī)制的優(yōu)勢(shì)在于其能夠直接控制數(shù)據(jù)的訪問(wèn)權(quán)限,確保數(shù)據(jù)的一致性和完整性。然而,在高并發(fā)環(huán)境下,封鎖機(jī)制容易導(dǎo)致性能瓶頸、鎖爭(zhēng)用和死鎖等并發(fā)問(wèn)題,尤其是一個(gè)對(duì)象的更新和讀取操作不允許同時(shí)進(jìn)行,會(huì)直接影響系統(tǒng)效率。

MVCC機(jī)制是一種更為現(xiàn)代的并發(fā)控制方式,對(duì)同一個(gè)記錄多次更新將會(huì)形成一個(gè)版本鏈,它通過(guò)版本鏈來(lái)實(shí)現(xiàn)讀寫操作的并發(fā)執(zhí)行。在MVCC機(jī)制下,每個(gè)事務(wù)都會(huì)看到一個(gè)獨(dú)立的數(shù)據(jù)快照,讀操作可以直接基于快照讀取數(shù)據(jù),而不需要等待寫操作完成或獲取鎖。MVCC原理2.活躍事務(wù)及版本鏈活躍事務(wù)是指已經(jīng)開始但還沒有結(jié)束(Commit/Rollback)的事務(wù)。表中的每條記錄某時(shí)刻都可能存在0至多個(gè)活躍事務(wù)。系統(tǒng)為活躍事務(wù)分配事務(wù)號(hào)(trx_id),且事務(wù)號(hào)由系統(tǒng)變量控制,按遞增順序產(chǎn)生。1.記錄中的隱藏列每張表的聚簇索引記錄中都包含兩個(gè)隱藏列:trx_id:每次更新記錄的事務(wù)號(hào)。roll_pointer:每次對(duì)某條聚簇索引記錄進(jìn)行更新時(shí),都會(huì)把舊的版本寫入到undo日志中,然后將日志地址保存在隱藏列中,這個(gè)隱藏列就相當(dāng)于一個(gè)指針,可以通過(guò)它來(lái)找到該記錄更新前的信息。對(duì)同一個(gè)記錄多次更新將會(huì)形成一個(gè)版本鏈。MVCC原理【例11.15】以賬戶表account表為例,假設(shè)account表中初始有3條記錄,數(shù)據(jù)如表所示。假設(shè)T10、T20兩個(gè)事務(wù)分別對(duì)A記錄進(jìn)行更新操作,更新流程如下表所示,畫出A記錄的版本鏈。MVCC原理t1:T10和T20事務(wù)開始前,當(dāng)前沒有任何事務(wù)在更新A記錄,A記錄上的活躍事務(wù)為0,t2:T10和T20對(duì)A記錄執(zhí)行了更新操作,T10和T20都為A記錄上的活躍事務(wù)。t3:T10再次更新了A記錄,A記錄版本鏈如圖所示。MVCC原理t4:T10執(zhí)行了提交(Commit)操作,此時(shí),A記錄上的活躍事務(wù)只有T20。t5:

T20更新了A記錄,A記錄上的活躍事務(wù)為T20,記錄版本鏈如圖所示。t6:

T20執(zhí)行了提交(Commit)操作,此時(shí),A記錄上沒有活躍事務(wù)。MVCC原理3.ReadViewReadView又稱讀視圖或快照,是一個(gè)事務(wù)在執(zhí)行快照讀時(shí)所依據(jù)的數(shù)據(jù)版本集合。當(dāng)一個(gè)事務(wù)開始時(shí),它會(huì)根據(jù)當(dāng)前系統(tǒng)中存在的所有活躍事務(wù)創(chuàng)建一個(gè)讀視圖。這個(gè)讀視圖決定了事務(wù)能看到哪些數(shù)據(jù)版本。ReadView中主要包含3個(gè)重要的參數(shù):m_ids[]:表示在生成ReadView時(shí)當(dāng)前系統(tǒng)中活躍事務(wù)的id列表。min_trx_id:表示在生成ReadView時(shí)當(dāng)前系統(tǒng)中活躍事務(wù)中最小的id,也就是m_ids[]中的最小值。max_trx_id:表示生成ReadView時(shí)系統(tǒng)中應(yīng)該分配給下一個(gè)事務(wù)的id值。MVCC原理4.多版本并發(fā)控制算法當(dāng)事務(wù)執(zhí)行快照讀(如SELECT操作)時(shí),數(shù)據(jù)庫(kù)管理系統(tǒng)會(huì)生成一個(gè)當(dāng)前的快照,其中記錄和維護(hù)了當(dāng)前活躍事務(wù)的id及相關(guān)信息,通過(guò)比較數(shù)據(jù)記錄的事務(wù)版本號(hào)和ReadView中的事務(wù)號(hào),可以確定哪些版本的數(shù)據(jù)對(duì)當(dāng)前事務(wù)是可見的。MVCC原理5.

MVCC在不同隔離級(jí)別中的應(yīng)用READUNCOMMITTED和SERIALIZABLE隔離級(jí)別的事務(wù),通過(guò)封鎖來(lái)實(shí)現(xiàn)控制,不受MVCC機(jī)制控制。READCOMMITTED和REPEATABLEREAD隔離級(jí)別的事務(wù),使用封鎖來(lái)更新記錄,使用MVCC機(jī)制能夠確保在記錄正在被更新時(shí)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論