-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
讀已提交怎么實(shí)現(xiàn)(讀已提交有什么問題)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于讀已提交怎么實(shí)現(xiàn)的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、mysql是如何實(shí)現(xiàn)可重復(fù)讀的?
一個(gè)事務(wù)要更新一行,如果剛好有另外一個(gè)事務(wù)擁有這一行的行鎖,會(huì)被鎖住,進(jìn)入等待狀態(tài)。既然進(jìn)入了等待狀態(tài),那么等到這個(gè)事務(wù)自己獲取到行鎖要更新數(shù)據(jù)的時(shí)候,它讀到的值又是什么呢?
可重復(fù)讀隔離級別下,事務(wù)在啟動(dòng)的時(shí)候就“拍了個(gè)整個(gè)庫的快照”。如果一個(gè)庫有100G,那么我啟動(dòng)一個(gè)事務(wù),MySQL就要拷⻉100G的數(shù)據(jù)出來,這個(gè)過程得多慢啊。但是平時(shí)事務(wù)執(zhí)行起來卻是非常快的。不是全部拷貝出來那是怎么實(shí)現(xiàn)的呢?
InnoDB里面每個(gè)事務(wù)有一個(gè)唯一的事務(wù)ID,叫作transaction id。它是在事務(wù)開始的時(shí)候向InnoDB的事務(wù)系統(tǒng)申請的,是按申請順序嚴(yán)格遞增的。
而每行數(shù)據(jù)也都是有多個(gè)版本的。每次事務(wù)更新數(shù)據(jù)的時(shí)候,都會(huì)生成一個(gè)新的數(shù)據(jù)版本,并且把transaction id賦值給這個(gè)數(shù) 據(jù)版本的事務(wù)ID,記為row trx_id。同時(shí),舊的數(shù)據(jù)版本要保留,并且在新的數(shù)據(jù)版本中,能夠有信息可以直接拿到它。
數(shù)據(jù)表中的一行記錄,其實(shí)可能有多個(gè)版本(row),每個(gè)版本有自己的row trx_id。
圖中虛線框里是同一行數(shù)據(jù)的4個(gè)版本,當(dāng)前最新版本是V4,k的值是22,它是被transaction id 為25的事務(wù)更新的,因此它的row trx_id也是25。語句更新會(huì)生成undo log(回滾日志),圖中的三個(gè)虛線箭頭,就是undo log。
按照可重復(fù)讀的定義,一個(gè)事務(wù)啟動(dòng)的時(shí)候,能夠看到所有已經(jīng)提交的事務(wù)結(jié)果。但是之后,這個(gè)事務(wù)執(zhí)行期間,其他事務(wù)的更新對它不可⻅。
一個(gè)事務(wù)只需要在啟動(dòng)的時(shí)候聲明說,“以我啟動(dòng)的時(shí)刻為準(zhǔn),如果一個(gè)數(shù)據(jù)版本是在我啟動(dòng)之前生成的,就認(rèn);如果是我啟動(dòng)以后才生成的,我就不認(rèn),我必須要找到它的上一個(gè)版本”。
如果“上一個(gè)版本”也不可⻅,那就得繼續(xù)往前找。如果是這個(gè)事務(wù)自己更新的數(shù)據(jù),它自己還是要認(rèn)的。
在實(shí)現(xiàn)上, InnoDB為每個(gè)事務(wù)構(gòu)造了一個(gè)數(shù)組,用來保存這個(gè)事務(wù)啟動(dòng)瞬間,當(dāng)前正在“活躍”的所有事務(wù)ID?!盎钴S”指的就 是,啟動(dòng)了但還沒提交。數(shù)組里面事務(wù)ID的最小值記為低水位,當(dāng)前系統(tǒng)里面已經(jīng)創(chuàng)建過的事務(wù)ID的最大值加1記為高水位。 這個(gè)視圖數(shù)組和高水位,就組成了當(dāng)前事務(wù)的一致性視圖(read-view)。而數(shù)據(jù)版本的可⻅性規(guī)則,就是基于數(shù)據(jù)的row trx_id和這個(gè)一致性視圖的對比結(jié)果得到的。
InnoDB利用了“所有數(shù)據(jù)都有多個(gè)版本”的這個(gè)特性,實(shí)現(xiàn)了“秒級創(chuàng)建快照”的能力。
回到我們最開始的表格,看看最后執(zhí)行的結(jié)果是多少。做如下假設(shè):
事務(wù)A的視圖數(shù)組就是[99,100], 事務(wù)B的視圖數(shù)組是[99,100,101], 事務(wù)C的視圖數(shù)組是[99,100,101,102]。為了簡化分析,我先把其他干擾語句去掉,只畫出跟事務(wù)A查詢邏輯有關(guān)的操作:
第一個(gè)有效更新是事務(wù)C,把數(shù)據(jù)從(1,1)改成了(1,2)。這時(shí)候,這個(gè)數(shù)據(jù)的最新版本的row trx_id是102,而90這個(gè)版本已經(jīng)成為了歷史版本。 第二個(gè)有效更新是事務(wù)B,把數(shù)據(jù)從(1,2)改成了(1,3)。這時(shí)候,這個(gè)數(shù)據(jù)的最新版本(即row trx_id)是101,而102又成為了歷史版本。
事務(wù)B的update語句,如果按照一致性讀,好像結(jié)果不對哦?
事務(wù)B的視圖數(shù)組是先生成的,之后事務(wù)C才提交,不是應(yīng)該看不⻅(1,2)嗎,怎么能算出(1,3)來?
事務(wù)B在更新之前查詢一次數(shù)據(jù),這個(gè)查詢返回的k的值確實(shí)是1。 但是,當(dāng)它要去更新數(shù)據(jù)的時(shí)候,就不能再在歷史版本上更新了,否則事務(wù)C的更新就丟失了。因此,事務(wù)B此時(shí)的set k=k+1是在(1,2)的基礎(chǔ)上進(jìn)行的操作。 所以,這里就用到了這樣一條規(guī)則:更新數(shù)據(jù)都是先讀后寫的,而這個(gè)讀,只能讀當(dāng)前的值,稱為 “當(dāng)前讀” ( current read )。
在更新的時(shí)候,當(dāng)前讀拿到的數(shù)據(jù)是(1,2),更新后生成了新版本的數(shù)據(jù)(1,3),這個(gè)新版本的row trx_id是101。
所以,在執(zhí)行事務(wù)B查詢語句的時(shí)候,一看自己的版本號是101,最新數(shù)據(jù)的版本號也是101,是自己的更新,可以直接使用, 所以查詢得到的k的值是3。
select語句如果加鎖,也是當(dāng)前讀。
如果把事務(wù)A的查詢語句select * from t where id=1修改一下,加上lock in share mode 或 for update,也都可以讀到版本號是101的數(shù)據(jù),返回的k的值是3。下面這兩個(gè)select語句,就是分別加了讀鎖(S鎖,共享鎖)和寫鎖(X鎖,排他鎖)。
事務(wù)C’的不同是,更新后并沒有⻢上提交,在它提交前,事務(wù)B的更新語句先發(fā)起了。前面說過了,雖然事務(wù)C’還沒提交,但是(1,2)這個(gè)版本也已經(jīng)生成了,并且是當(dāng)前的最新版本。那么,事務(wù)B的更新語句會(huì)怎么處理呢?
兩階段鎖協(xié)議,事務(wù)C’沒提交,也就是說(1,2)這個(gè)版本上的寫鎖還沒釋放。 而事務(wù)B是當(dāng)前讀,必須要讀最新版本,而且必須加鎖,因此就被鎖住了,必須等到事務(wù)C’釋放這個(gè)鎖,才能繼續(xù)它的當(dāng)前讀。
回到最初的問題,事務(wù)的可重復(fù)讀的能力是怎么實(shí)現(xiàn)的?
二、html表單提交之后,轉(zhuǎn)到一個(gè)新的頁面,怎么獲取已提交的信息?
如果只是顯示的話,就不需要數(shù)據(jù)庫。<form action="aaaa.asp"method="post"name="form">用戶名:<input type="text"value="張三"name="user"<input type="submit"value="提交"name="button"></form>aaaa.asp的代碼如下:
三、用jquery如何實(shí)現(xiàn)提交表單點(diǎn)擊提交之后顯示正在上傳中,之后顯示上傳成功的效果?
需要準(zhǔn)備的材料分別有:電腦、html編輯器、瀏覽器。
1、首先,打開html編輯器,新建html文件,例如:index.html,并引入jquery。
2、在index.html中的<script>標(biāo)簽,輸入jquery代碼:
$('button').click(function () {
$('body').append('<span>正在上傳中</span>');
setTimeout("$('span').text('上傳成功');", 1000);
});
3、瀏覽器運(yùn)行index.html頁面,點(diǎn)擊提交按鈕,顯示了“正在上傳中”。
4、例如過了1秒后變成了上傳成功的提示。
四、mfc 怎么完成由用戶提交文件來對文件進(jìn)行讀寫
使用打開文件對話框。
以上就是關(guān)于讀已提交怎么實(shí)現(xiàn)相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
讀已提交與可重復(fù)讀差別(讀已提交與可重復(fù)讀差別 mysql默認(rèn))
讀已提交怎么實(shí)現(xiàn)(讀已提交有什么問題)
谷歌搜索免費(fèi)引擎入口(谷歌搜索免費(fèi)引擎入口香港)
萬柏林抖音代運(yùn)營是什么(萬柏林抖音代運(yùn)營是什么公司)