java事務(wù)的基礎(chǔ)特性和隔離級(jí)別介紹

這篇文章主要介紹“java事務(wù)的基礎(chǔ)特性和隔離級(jí)別介紹”,在日常操作中,相信很多人在java事務(wù)的基礎(chǔ)特性和隔離級(jí)別介紹問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”java事務(wù)的基礎(chǔ)特性和隔離級(jí)別介紹”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比從江網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式從江網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋從江地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

什么是事務(wù)

事務(wù)是訪問數(shù)據(jù)庫的一個(gè)操作序列,數(shù)據(jù)庫應(yīng)用系統(tǒng)通過事務(wù)集來完成對(duì)數(shù)據(jù)庫的存取。事務(wù)的正確執(zhí)行使得數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)換為另一種狀態(tài)

事務(wù)必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability)的縮寫,這四種狀態(tài)的意思是:

1、原子性

即不可分割,事務(wù)要么全部被執(zhí)行,要么全部不執(zhí)行。如果事務(wù)的所有子事務(wù)全部提交成功,則所有的數(shù)據(jù)庫操作被提交,數(shù)據(jù)庫狀態(tài)發(fā)生變化;如果有子事務(wù)失敗,則其他子事務(wù)的數(shù)據(jù)庫操作被回滾,即數(shù)據(jù)庫回到事務(wù)執(zhí)行前的狀態(tài),不會(huì)發(fā)生狀態(tài)轉(zhuǎn)換

2、一致性

事務(wù)的執(zhí)行使得數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)換成另外一種正確狀態(tài)

3、隔離性

在事務(wù)正確提交之前,不允許把事務(wù)對(duì)該數(shù)據(jù)的改變提供給任何其他事務(wù),即在事務(wù)正確提交之前,它可能的結(jié)果不應(yīng)該顯示給其他事務(wù)

4、持久性

事務(wù)正確提交之后,其結(jié)果將永遠(yuǎn)保存在數(shù)據(jù)庫之中,即使在事務(wù)提交之后有了其他故障,事務(wù)的處理結(jié)果也會(huì)得到保存

事務(wù)的作用

事務(wù)管理對(duì)于企業(yè)級(jí)應(yīng)用而言至關(guān)重要,它保證了用戶的每一次操作都是可靠的,即便出現(xiàn)了異常的訪問情況,也不至于破壞后臺(tái)數(shù)據(jù)的完整性。就像銀行的自動(dòng)提款機(jī)ATM,通常ATM都可以正常為客戶服務(wù),但是也難免遇到操作過程中及其突然出故障的情況,此時(shí),事務(wù)就必須確保出故障前對(duì)賬戶的操作不生效,就像用戶剛才完全沒有使用過ATM機(jī)一樣,以保證用戶和銀行的利益都不受損失。

并發(fā)下事務(wù)會(huì)產(chǎn)生的問題

舉個(gè)例子,事務(wù)A和事務(wù)B操縱的是同一個(gè)資源,事務(wù)A有若干個(gè)子事務(wù),事務(wù)B也有若干個(gè)子事務(wù),事務(wù)A和事務(wù)B在高并發(fā)的情況下,會(huì)出現(xiàn)各種各樣的問題。"各種各樣的問題",總結(jié)一下主要就是五種:第一類丟失更新、第二類丟失更新、臟讀、不可重復(fù)讀、幻讀。五種之中,第一類丟失更新、第二類丟失更新不重要,不講了,講一下臟讀、不可重復(fù)讀和幻讀。

1、臟讀

所謂臟讀,就是指事務(wù)A讀到了事務(wù)B還沒有提交的數(shù)據(jù),比如銀行取錢,事務(wù)A開啟事務(wù),此時(shí)切換到事務(wù)B,事務(wù)B開啟事務(wù)-->取走100元,此時(shí)切換回事務(wù)A,事務(wù)A讀取的肯定是數(shù)據(jù)庫里面的原始數(shù)據(jù),因?yàn)槭聞?wù)B取走了100塊錢,并沒有提交,數(shù)據(jù)庫里面的賬務(wù)余額肯定還是原始余額,這就是臟讀。

2、不可重復(fù)讀

所謂不可重復(fù)讀,就是指在一個(gè)事務(wù)里面讀取了兩次某個(gè)數(shù)據(jù),讀出來的數(shù)據(jù)不一致。還是以銀行取錢為例,事務(wù)A開啟事務(wù)-->查出銀行卡余額為1000元,此時(shí)切換到事務(wù)B事務(wù)B開啟事務(wù)-->事務(wù)B取走100元-->提交,數(shù)據(jù)庫里面余額變?yōu)?00元,此時(shí)切換回事務(wù)A,事務(wù)A再查一次查出賬戶余額為900元,這樣對(duì)事務(wù)A而言,在同一個(gè)事務(wù)內(nèi)兩次讀取賬戶余額數(shù)據(jù)不一致,這就是不可重復(fù)讀。

3、幻讀

所謂幻讀,就是指在一個(gè)事務(wù)里面的操作中發(fā)現(xiàn)了未被操作的數(shù)據(jù)。比如學(xué)生信息,事務(wù)A開啟事務(wù)-->修改所有學(xué)生當(dāng)天簽到狀況為false,此時(shí)切換到事務(wù)B,事務(wù)B開啟事務(wù)-->事務(wù)B插入了一條學(xué)生數(shù)據(jù),此時(shí)切換回事務(wù)A,事務(wù)A提交的時(shí)候發(fā)現(xiàn)了一條自己沒有修改過的數(shù)據(jù),這就是幻讀,就好像發(fā)生了幻覺一樣?;米x出現(xiàn)的前提是并發(fā)的事務(wù)中有事務(wù)發(fā)生了插入、刪除操作。

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

事務(wù)隔離級(jí)別,就是為了解決上面幾種問題而誕生的。為什么要有事務(wù)隔離級(jí)別,因?yàn)?strong>事務(wù)隔離級(jí)別越高,在并發(fā)下會(huì)產(chǎn)生的問題就越少,但同時(shí)付出的性能消耗也將越大,因此很多時(shí)候必須在并發(fā)性和性能之間做一個(gè)權(quán)衡。所以設(shè)立了幾種事務(wù)隔離級(jí)別,以便讓不同的項(xiàng)目可以根據(jù)自己項(xiàng)目的并發(fā)情況選擇合適的事務(wù)隔離級(jí)別,對(duì)于在事務(wù)隔離級(jí)別之外會(huì)產(chǎn)生的并發(fā)問題,在代碼中做補(bǔ)償。

事務(wù)隔離級(jí)別有4種,但是像Spring會(huì)提供給用戶5種,來看一下:

1、DEFAULT

默認(rèn)隔離級(jí)別,每種數(shù)據(jù)庫支持的事務(wù)隔離級(jí)別不一樣,如果Spring配置事務(wù)時(shí)將isolation設(shè)置為這個(gè)值的話,那么將使用底層數(shù)據(jù)庫的默認(rèn)事務(wù)隔離級(jí)別。順便說一句,如果使用的MySQL,可以使用"select @@tx_isolation"來查看默認(rèn)的事務(wù)隔離級(jí)別

2、READ_UNCOMMITTED

讀未提交,即能夠讀取到?jīng)]有被提交的數(shù)據(jù),所以很明顯這個(gè)級(jí)別的隔離機(jī)制無法解決臟讀、不可重復(fù)讀、幻讀中的任何一種,因此很少使用

3、READ_COMMITED

讀已提交,即能夠讀到那些已經(jīng)提交的數(shù)據(jù),自然能夠防止臟讀,但是無法限制不可重復(fù)讀和幻讀

4、REPEATABLE_READ

重復(fù)讀取,即在數(shù)據(jù)讀出來之后加鎖,類似"select * from XXX for update",明確數(shù)據(jù)讀取出來就是為了更新用的,所以要加一把鎖,防止別人修改它。REPEATABLE_READ的意思也類似,讀取了一條數(shù)據(jù),這個(gè)事務(wù)不結(jié)束,別的事務(wù)就不可以改這條記錄,這樣就解決了臟讀、不可重復(fù)讀的問題,但是幻讀的問題還是無法解決

5、SERLALIZABLE

串行化,最高的事務(wù)隔離級(jí)別,不管多少事務(wù),挨個(gè)運(yùn)行完一個(gè)事務(wù)的所有子事務(wù)之后才可以執(zhí)行另外一個(gè)事務(wù)里面的所有子事務(wù),這樣就解決了臟讀、不可重復(fù)讀和幻讀的問題了

網(wǎng)上專門有圖用表格的形式列出了事務(wù)隔離級(jí)別解決的并發(fā)問題:

java事務(wù)的基礎(chǔ)特性和隔離級(jí)別介紹

再必須強(qiáng)調(diào)一遍,不是事務(wù)隔離級(jí)別設(shè)置得越高越好,事務(wù)隔離級(jí)別設(shè)置得越高,意味著勢(shì)必要花手段去加鎖用以保證事務(wù)的正確性,那么效率就要降低,因此實(shí)際開發(fā)中往往要在效率和并發(fā)正確性之間做一個(gè)取舍,一般情況下會(huì)設(shè)置為READ_COMMITED,此時(shí)避免了臟讀,并發(fā)性也還不錯(cuò),之后再通過一些別的手段去解決不可重復(fù)讀和幻讀的問題就好了。

到此,關(guān)于“java事務(wù)的基礎(chǔ)特性和隔離級(jí)別介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

本文名稱:java事務(wù)的基礎(chǔ)特性和隔離級(jí)別介紹
轉(zhuǎn)載來于:http://bm7419.com/article48/pcgohp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)網(wǎng)站導(dǎo)航、品牌網(wǎng)站設(shè)計(jì)、手機(jī)網(wǎng)站建設(shè)、虛擬主機(jī)、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)