您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“java事務(wù)、事務(wù)的隔離級(jí)別的概念是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
事務(wù),即數(shù)據(jù)庫(kù)事務(wù)。是數(shù)據(jù)庫(kù)管理系統(tǒng)執(zhí)行過(guò)程中的一個(gè)邏輯單位,由一個(gè)有限的數(shù)據(jù)庫(kù)操作序列構(gòu)成。
通常,事務(wù)的正確執(zhí)行會(huì)使數(shù)據(jù)庫(kù)從一種狀態(tài)轉(zhuǎn)換為另一種狀態(tài)。
原子性(atomicity) 即不可分割性,事務(wù)要么全執(zhí)行、要么全不執(zhí)行。
一致性(consistency) 事務(wù)的執(zhí)行使得數(shù)據(jù)庫(kù)從一種正確狀態(tài)轉(zhuǎn)換成另外一種正確狀態(tài)。
隔離性(isolation) 在事務(wù)正確提交之前,不允許把事務(wù)對(duì)該數(shù)據(jù)的改變提供給任何其他事務(wù)。
持久性(durability) 事務(wù)正確提交之后,其結(jié)果將永遠(yuǎn)保存在數(shù)據(jù)庫(kù)之中。
并發(fā)狀態(tài)解釋為當(dāng)事務(wù)A和事務(wù)B對(duì)同一資源進(jìn)行操作時(shí),可能會(huì)遇到很多的問(wèn)題。
即事務(wù)A讀到了事務(wù)B還沒(méi)有提交的數(shù)據(jù)。如果事務(wù)A對(duì)數(shù)據(jù)進(jìn)行了更新,但是事務(wù)A并沒(méi)有提交,但是事務(wù)B這個(gè)時(shí)候看到了事務(wù)A沒(méi)有提交的更新。當(dāng)事務(wù)A進(jìn)行了回滾,那么剛剛事務(wù)B看到的數(shù)據(jù)就是臟數(shù)據(jù)。也就是臟讀。
例子:
A 給 B 轉(zhuǎn)了100萬(wàn),但是 A 還沒(méi)有提交,此時(shí) B 查詢自己賬戶,多了100萬(wàn)。然后 A 發(fā)現(xiàn)轉(zhuǎn)錯(cuò)人了,回滾了事物。然后 B 100萬(wàn)就沒(méi)了。在這個(gè)過(guò)程中 B 查到了沒(méi)有提交的數(shù)據(jù)(多出的100萬(wàn)),這就是臟讀。
即同一事務(wù)在事務(wù)執(zhí)行過(guò)程中對(duì)同一個(gè)數(shù)據(jù)進(jìn)行了多次讀取,但是每一次讀取的數(shù)據(jù)結(jié)果都不相同。原因是在兩次讀取間隔,數(shù)據(jù)別其他人修改了,導(dǎo)致了統(tǒng)一事務(wù)兩次讀取結(jié)果不一致。
例子:
A 查詢銀行余額為100萬(wàn),B 這個(gè)時(shí)候取走了50萬(wàn),此時(shí)余額變成了50萬(wàn),A 再一次查詢余額,變成了50萬(wàn)。對(duì) A 而言兩次結(jié)果不一致就是不可重復(fù)讀。
即在事務(wù) A 多次讀取數(shù)據(jù)集的過(guò)程中中,事務(wù) B 對(duì)數(shù)據(jù)進(jìn)行了新增操作或者刪除操作,導(dǎo)致事務(wù) A 多次讀取的數(shù)據(jù)集不一致。
例子:
A 修改當(dāng)前公司所有職員信息的時(shí)候,B 向其中插入了一個(gè)新的職員,這個(gè)時(shí)候 A 提交的時(shí)候發(fā)現(xiàn)了一個(gè)自己沒(méi)有修改過(guò)的職員的信息,對(duì) A 而言就像是產(chǎn)生了幻覺(jué)。
為了應(yīng)對(duì)上面并發(fā)情況下出現(xiàn)的問(wèn)題,事務(wù)的隔離級(jí)別就產(chǎn)生了。當(dāng)事務(wù)的隔離級(jí)別越高的時(shí)候,上面的問(wèn)題就會(huì)越少,但是性能消耗也會(huì)越大。所以在實(shí)際生產(chǎn)過(guò)程中,要根據(jù)需求去確定隔離級(jí)別。
讀未提交,即能夠讀取到?jīng)]有被提交的數(shù)據(jù),所以很明顯這個(gè)級(jí)別的隔離機(jī)制無(wú)法解決臟讀、不可重復(fù)讀、幻讀中的任何一種。
已提交,即能夠讀到那些已經(jīng)提交的數(shù)據(jù),能夠防止臟讀,但是無(wú)法解決不可重復(fù)讀和幻讀的問(wèn)題。
重復(fù)讀取,即在數(shù)據(jù)讀出來(lái)之后加鎖,類似”select * from XXX for update”,明確數(shù)據(jù)讀取出來(lái)就是為了更新用的,所以要加一把鎖,防止別人修改它。REPEATABLE_READ的意思也類似,讀取了一條數(shù)據(jù),這個(gè)事務(wù)不結(jié)束,別的事務(wù)就不可以改這條記錄,這樣就解決了臟讀、不可重復(fù)讀的問(wèn)題,但是幻讀的問(wèn)題還是無(wú)法解決。
串行化,最高的事務(wù)隔離級(jí)別,不管多少事務(wù),挨個(gè)運(yùn)行完一個(gè)事務(wù)的所有子事務(wù)之后才可以執(zhí)行另外一個(gè)事務(wù)里面的所有子事務(wù),這樣就解決了臟讀、不可重復(fù)讀和幻讀的問(wèn)題了。
“java事務(wù)、事務(wù)的隔離級(jí)別的概念是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。