亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯(cuò)點(diǎn)、幻讀

 更新時(shí)間:2021年11月18日 14:54:17   作者:日常打BUG  
這篇文章主要介紹了基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯(cuò)點(diǎn)、幻讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

ACID,事務(wù)內(nèi)的一組操作具有 原子性 、一致性、隔離性、持久性。

  • Atomicity(原子性):一個(gè)事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被恢復(fù)(Rollback)到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣。
  • Consistency(一致性):在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性沒(méi)有被破壞。這表示寫(xiě)入的資料必須完全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫(kù)可以自發(fā)性地完成預(yù)定的工作。
  • Isolation(隔離性):數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫(xiě)和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級(jí)別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。

為什么要使用事務(wù)?

就是一組操作中,存在著多個(gè)更新修改操作,并且要滿(mǎn)足事務(wù)的相關(guān)要求,所以就需要使用到事務(wù)。最常見(jiàn)的例子就是銀行兩個(gè)賬戶(hù)間的轉(zhuǎn)賬,包含的A扣款 、B到賬等多個(gè)操作,這些個(gè)操作需要具備事務(wù)的特性。比如說(shuō),要么A成功扣款,B也成功到賬;不能出現(xiàn)A扣款了,B沒(méi)到賬(原子性);也不能出現(xiàn)現(xiàn)在AB都處理成功了,后續(xù)又出現(xiàn)A賬戶(hù)的錢(qián)又增多了(持久性);也不能出現(xiàn)A賬號(hào)初始余額充足,兩個(gè)并發(fā)處理,導(dǎo)致出現(xiàn)余額為負(fù)的情況(隔離性)。

如何使用事務(wù)?

在spring中可以使用聲明性的注解事務(wù),即在有需要使用的方法、類(lèi)上,用@Transactional

修飾即可。修飾的方法、類(lèi)就是這個(gè)事務(wù)的包裹區(qū)域。出現(xiàn)了對(duì)應(yīng)的異常就會(huì)在AOP中觸發(fā)回滾。

默認(rèn)的回滾是錯(cuò)誤與運(yùn)行異常,不包括檢驗(yàn)異常。

rollbackFor參數(shù)支持用戶(hù)自行設(shè)置,例如可定義異常跟運(yùn)行異常,如下所示;也支持自定義異常類(lèi)

    @Transactional(rollbackFor = { Exception.class, RuntimeException.class })

默認(rèn)的事務(wù)傳播機(jī)制是Propagation.REQUIRED

事務(wù)的傳播本質(zhì)確定好事務(wù)的限制區(qū)域,即哪些代碼是受到事務(wù)保護(hù)的,出現(xiàn)異??梢曰貪L。

細(xì)節(jié)點(diǎn):

  • 代碼出現(xiàn)事務(wù)配置的異常,在事務(wù)內(nèi)的會(huì)自動(dòng)回滾;如果在對(duì)應(yīng)的方法體內(nèi)使用了try catch捕獲異常,異常沒(méi)有拋出去,那就不會(huì)回滾,需要手動(dòng)回滾了。在catch語(yǔ)句中增加手動(dòng)回滾的TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語(yǔ)句
  • public 方法的事務(wù)才生效

事務(wù)的傳播帶來(lái)的幾種結(jié)果

  • 外層沒(méi)有事務(wù)的話,內(nèi)在的子方法,沒(méi)有的就沒(méi)有;有事務(wù)的就會(huì)有事務(wù),有事務(wù)的效果形同Propagation.REQUIRES_NEW,互相獨(dú)立,每個(gè)都是一個(gè)不同的新事務(wù)
  • 外層有事務(wù)的話,那這個(gè)整個(gè)方法都在一個(gè)事務(wù)的區(qū)域范圍內(nèi),內(nèi)外任何一處回滾,都是整個(gè)回滾。但是Propagation.NESTED修飾的內(nèi)部方法,可以單獨(dú)回滾掉自己這個(gè)內(nèi)部方法,作為一個(gè)嵌入子事務(wù)所具有的獨(dú)特性。
  • 外層有還是沒(méi)有事務(wù),Propagation.REQUIRES_NEW修飾的方法都是作為一個(gè)獨(dú)立的事務(wù),自己獨(dú)立控制回滾與提交,與外層事務(wù)無(wú)關(guān)聯(lián)。

此處舉例的事務(wù),指的是 默認(rèn)值為 Propagation.REQUIRED的傳播行為,以及Propagation.NESTED的傳播行為。

兩個(gè)特例

  • 同一個(gè)類(lèi)中有A、B兩個(gè)方法,A調(diào)用B方法。A沒(méi)事務(wù),B有事務(wù),B有異常時(shí),回滾失敗
A沒(méi)事務(wù) A有事務(wù)
B沒(méi)事務(wù) 沒(méi)有事務(wù)的效果 不分析 事務(wù)生效,B的異常,可以讓整個(gè)A回滾
B有事務(wù) 事務(wù)失效 事務(wù)生效,同上 不分析

若是A/B在同一個(gè)類(lèi)中,A方法有事務(wù),B方法沒(méi)有事務(wù),這個(gè)時(shí)候事務(wù)會(huì)生效,原因是異常傳導(dǎo)到了A方法中;

A方法沒(méi)事務(wù),B方法有事務(wù),A調(diào)用B方法。若是A/B在同一個(gè)類(lèi)中,B方法事務(wù)失效。A/B在不同的類(lèi),B方法有事務(wù)效果。

原因分析:這是動(dòng)態(tài)代理導(dǎo)致的,當(dāng)要執(zhí)行B方法的回滾時(shí),此時(shí)A調(diào)用的B方法,不是動(dòng)態(tài)代理的那個(gè)類(lèi),無(wú)法進(jìn)行回滾。

  • A方法循環(huán)調(diào)用B方法,A方法有事務(wù),B方法啟用新事務(wù),B方法處理成功一條提交一條的數(shù)據(jù);B方法遇到異常,有異常的那條回滾,不影響之前處理成功提交的數(shù)據(jù)。

從之前的推斷來(lái)看,Propagation.REQUIRES_NEW修飾的內(nèi)部方法獨(dú)立一個(gè)新事務(wù),跟外層沒(méi)有關(guān)系,其實(shí)是兩個(gè)事務(wù)了,外層事務(wù)回滾內(nèi)存的也不會(huì)回滾;內(nèi)層回滾也不影響外層事務(wù)。

但是實(shí)際結(jié)果還是有點(diǎn)不太一樣,若是A/B在不同類(lèi)中,可以達(dá)到這個(gè)效果;同一個(gè)類(lèi)的話,就會(huì)回滾失敗。跟上面AB方法調(diào)用的結(jié)果類(lèi)似。

究其原因,還是由于使用了動(dòng)態(tài)代理來(lái)進(jìn)行事務(wù)AOP的,此時(shí)的B方法一旦觸發(fā)回滾就是事務(wù)回滾異常了。那么要想一個(gè)類(lèi)中兩個(gè)方法間調(diào)用達(dá)到部分提交的效果,需要使用ApplicationContext 上下文對(duì)象獲取當(dāng)前類(lèi)對(duì)象,再進(jìn)行調(diào)用;

// 使用 ApplicationContext 上下文對(duì)象獲取該對(duì)象;
@Autowired
private ApplicationContext applicationContext; 
CurrentClass classService = applicationContext.getBean(CurrentClass.class); 
//再用這個(gè)對(duì)象去調(diào)用同類(lèi)的其他方法
classService.b();

總結(jié): 事務(wù)的實(shí)現(xiàn)依賴(lài)于動(dòng)態(tài)代理,因此在同一個(gè)類(lèi)中使用了類(lèi)的其他方法時(shí),就需要額外注意了,只有使用動(dòng)態(tài)代理的對(duì)象去調(diào)用方法時(shí),才會(huì)有事務(wù)回滾的操作。

事務(wù)傳播屬性propagation

propagation 代表事務(wù)的傳播行為,默認(rèn)值為 Propagation.REQUIRED,總共的屬性信息如下:

  • Propagation.REQUIRED:如果當(dāng)前存在事務(wù),則加入該事務(wù),如果當(dāng)前不存在事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。(默認(rèn)傳播行為,一定會(huì)有一個(gè)事務(wù))

( 也就是說(shuō)如果A方法和B方法都添加了注解,在默認(rèn)傳播模式下,A方法內(nèi)部調(diào)用B方法,會(huì)把兩個(gè)方法的事務(wù)合并為一個(gè)事務(wù) )

  • Propagation.SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。(以當(dāng)前是否有事務(wù)為標(biāo)準(zhǔn),可以有事務(wù),也可以沒(méi)有事務(wù))
  • Propagation.MANDATORY:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則拋出異常。(要求當(dāng)前有事務(wù),就能運(yùn)行;沒(méi)有就會(huì)異常)
  • Propagation.REQUIRES_NEW:重新創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),暫停當(dāng)前的事務(wù)。

( 當(dāng)類(lèi)A中的 a 方法用默認(rèn)Propagation.REQUIRED模式,類(lèi)B中的 b方法加上采用 Propagation.REQUIRES_NEW模式,然后在 a 方法中調(diào)用 b方法操作數(shù)據(jù)庫(kù),然而 a方法拋出異常后,b方法并沒(méi)有進(jìn)行回滾,因?yàn)镻ropagation.REQUIRES_NEW會(huì)暫停 a方法的事務(wù) )

  • Propagation.NOT_SUPPORTED:以非事務(wù)的方式運(yùn)行,如果當(dāng)前存在事務(wù),暫停當(dāng)前的事務(wù)。(以非事務(wù)的方式運(yùn)行,當(dāng)前有不報(bào)錯(cuò))
  • Propagation.NEVER:以非事務(wù)的方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
  • Propagation.NESTED :如果當(dāng)前存在事務(wù),則嵌套事務(wù)內(nèi)執(zhí)行,如果不存在事務(wù)和 Propagation.REQUIRED 效果一樣。

( 也就是說(shuō)如果A方法和B方法都添加了注解,在A默認(rèn)傳播模式下,B方法加上采用 Propagation.NESTED模式,A方法內(nèi)部調(diào)用B方法,A回滾,B也會(huì)回滾;但B回滾,A不會(huì)回滾

數(shù)據(jù)庫(kù)隔離級(jí)別

事務(wù)的隔離級(jí)別依賴(lài)于數(shù)據(jù)庫(kù)的隔離級(jí)別,mysql的默認(rèn)隔離級(jí)別是可重復(fù)讀(repeatable read),對(duì)應(yīng)的效果是在一個(gè)事務(wù)內(nèi)重復(fù)讀取一個(gè)表中的數(shù)據(jù),一直會(huì)是一樣的,并不會(huì)讀取到那些個(gè)此事務(wù)范圍內(nèi)其他事務(wù) 未提交(臟讀)、已提交(不可重復(fù)讀)的修改記錄。

在對(duì)數(shù)據(jù)進(jìn)行測(cè)試隔離級(jí)別時(shí),需要先對(duì)數(shù)據(jù)庫(kù)進(jìn)行一系列的設(shè)置,包括關(guān)閉自動(dòng)提交、查看當(dāng)前的隔離級(jí)別,相關(guān)命令如下所示:

//由于變量autocommit分會(huì)話系統(tǒng)變量與全局系統(tǒng)變量, Value的值為ON,表示autocommit開(kāi)啟。
OFF表示autocommit關(guān)閉。
show session variables like 'autocommit';
show global variables like 'autocommit';
 
//關(guān)閉當(dāng)前會(huì)話的自動(dòng)提交
set session autocommit=0;
 
//開(kāi)啟一個(gè)事務(wù)
start transaction; 
begin;   
 
//回滾
rollback;    
//提交事務(wù)
commot; 
//查看當(dāng)前的隔離級(jí)別   查看全局、當(dāng)前會(huì)話的隔離級(jí)別
select @@tx_isolation;
SELECT @@global.tx_isolation, @@session.tx_isolation;
 
//設(shè)置當(dāng)前會(huì)話的隔離級(jí)別為read uncommitted級(jí)別:
set session transaction isolation level read uncommitted;
 
//設(shè)置當(dāng)前會(huì)話的隔離級(jí)別為read committed級(jí)別:
set session transaction isolation level read committed;
 
//設(shè)置當(dāng)前會(huì)話的隔離級(jí)別為repeatable read級(jí)別:
set session transaction isolation level repeatable read;
 
//設(shè)置當(dāng)前會(huì)話的隔離級(jí)別為serializable級(jí)別:
set session transaction isolation level serializable;
 
//展示連接id
select connection_id();
 
//數(shù)據(jù)庫(kù)超時(shí)設(shè)置查詢(xún)
show session variables like '%timeout';

事務(wù)的隔離級(jí)別總共分為:未提交讀(read uncommitted)、已提交讀(read committed)、可重復(fù)讀(repeatable read)、串行化(serializable)。

下面將對(duì)這四種一一展開(kāi)說(shuō)明:

1、未提交讀(會(huì)有臟讀的現(xiàn)象)

A事務(wù)已執(zhí)行,但未提交;B事務(wù)查詢(xún)到A事務(wù)的更新后數(shù)據(jù);A事務(wù)回滾;那么之前讀取到的A事務(wù)為提交的數(shù)據(jù)就是臟數(shù)據(jù)了。最低的隔離級(jí)別,很少會(huì)使用到。

---臟讀,讀取到了未提交的數(shù)據(jù)(新增、修改和刪除); 除此之外,還有會(huì)不可重復(fù)讀、幻讀的現(xiàn)象。

事務(wù)1設(shè)置如上所示,隔離級(jí)別為讀未提交,關(guān)閉了自動(dòng)提交。此時(shí)開(kāi)始一個(gè)事務(wù),看到的有兩條數(shù)據(jù);

再打開(kāi)一個(gè)窗口,關(guān)閉自動(dòng)提交,然后進(jìn)行新增改的操作

最后的結(jié)果如上所示,事務(wù)1讀取到了另一事務(wù)未提交時(shí)的新增、修改跟刪除的數(shù)據(jù)。

2、已提交讀

(會(huì)有不能重復(fù)讀的現(xiàn)象,因?yàn)槊看巫x取都是讀最新的,那就可能前后兩次會(huì)有差異了)

會(huì)讀取這一段時(shí)間內(nèi)其他事務(wù)對(duì)這些數(shù)據(jù)的變更操作,A事務(wù)執(zhí)行更新;B事務(wù)查詢(xún);A事務(wù)又執(zhí)行更新;B事務(wù)再次查詢(xún)時(shí),B事務(wù)前后兩次查詢(xún)到的數(shù)據(jù)不一致;例如事務(wù)B要更新?tīng)顟B(tài),因此先進(jìn)行一次查詢(xún),此時(shí)狀態(tài)為1,一系列操作后,馬上就要更新了,此時(shí)再次查詢(xún),第二次查詢(xún)出來(lái)的狀態(tài)變成了2。

---不可重復(fù)讀,一般指的是刪除、更新、新增;還會(huì)有幻讀的現(xiàn)象

不可重復(fù)讀的結(jié)果就是事務(wù)1能夠讀取到另外事務(wù)的 新增、修改、刪除操作,與臟讀的區(qū)別在于,一個(gè)是提交后才能讀取到,一個(gè)是未提交的實(shí)時(shí)操作就能讀取到。

3、可重復(fù)讀 (有可能覆蓋掉其他事務(wù)的操作)

可重復(fù)讀是mysql數(shù)據(jù)的默認(rèn)隔離級(jí)別,也是使用的較多的一種隔離級(jí)別,下面重點(diǎn)對(duì)其分析分析。

A事務(wù)無(wú)論執(zhí)行多少次,只要不提交,在這事務(wù)內(nèi)同一個(gè)SQL的查詢(xún)值永遠(yuǎn)都不變;可以理解成A事務(wù)內(nèi)的所有查詢(xún)都是 查詢(xún)A事務(wù)開(kāi)始時(shí)那一瞬間的數(shù)據(jù)快照;

幻讀: 由于互相隔離,以及可重復(fù)讀的特性,另一個(gè)事務(wù)也同時(shí)在處理同一數(shù)據(jù)的話,就會(huì)有一種空幻的現(xiàn)象,好像少了點(diǎn)什么。例如,兩個(gè)事務(wù)都帶id去插入同一數(shù)據(jù),那么后插入的數(shù)據(jù)會(huì)加鎖執(zhí)行失?。硪皇聞?wù)未提交)或者主鍵沖突(另一事務(wù)已提交),而插入失敗后再去查詢(xún),又會(huì)發(fā)現(xiàn)并沒(méi)有找到重復(fù)那條數(shù)據(jù)的,就會(huì)有種讀到了空白的感覺(jué),少讀取到了內(nèi)容。 幻讀不僅是插入,更新、刪除也會(huì)有這樣的現(xiàn)象的。

現(xiàn)實(shí)的一個(gè)例子,就是離銀行還款日期之前,A去查看賬單表,獲取到了此次的賬單數(shù)據(jù),求得了總和,根據(jù)賬單綜合就將賬單還清了,并且還再次查詢(xún),顯示已經(jīng)還清了。此時(shí),A將本次的查詢(xún),還款操作提交到數(shù)據(jù)庫(kù),在開(kāi)開(kāi)心心下班前,突然心血來(lái)潮再次進(jìn)行了查詢(xún)賬單操作,突然多了幾條消費(fèi)記錄了,需要再次還款。A就感覺(jué) 提交事務(wù)前的查詢(xún)有點(diǎn)幻讀了,少了幾條數(shù)據(jù)。

事務(wù)1在另一個(gè)事務(wù)提交后,再對(duì)同樣的數(shù)據(jù)做修改 刪除 新增操作。

---幻讀,一般值的是新增;就是明明查詢(xún)不到這條數(shù)據(jù),去新增時(shí)會(huì)報(bào)錯(cuò)。

其實(shí)更新、刪除也會(huì)有的,例如更新同一條用id+status去更新是,后提交的會(huì)更新失敗,這一特性也可用來(lái)加鎖,即CAS來(lái)更新數(shù)據(jù),這樣后操作的肯定就不會(huì)覆蓋前面的數(shù)據(jù)了。

已經(jīng)被刪除的數(shù)據(jù),此時(shí)去更新,也不會(huì)生效了,在這個(gè)事務(wù)內(nèi)再次查詢(xún)還是刪除前的那個(gè)數(shù)據(jù)快照。

如果更新數(shù)據(jù)時(shí)只用id,存在并發(fā)修改的情況,那么后提交的必定覆蓋之前事務(wù)的更新操作。比如本來(lái)數(shù)據(jù)的狀態(tài)是1,事務(wù)2將數(shù)據(jù)狀態(tài)有1->2,而事務(wù)1看的的狀態(tài)還是1,事務(wù)1直接使用id更新的話,將數(shù)據(jù)的狀態(tài)變成了3。事務(wù)1以為是1->3 ,其實(shí)是由 2->3,中間的狀態(tài)2直接就被覆蓋了。因此高并發(fā)的更新,需要慎重。

幻讀總結(jié): 很多對(duì)幻讀的解釋是,一個(gè)事務(wù)在查詢(xún)的同時(shí),另一個(gè)事務(wù)插入了數(shù)據(jù),然后前一個(gè)事務(wù)再次查詢(xún)就會(huì)發(fā)現(xiàn)多了幾條數(shù)據(jù),這個(gè)現(xiàn)象是不存在的,如果出現(xiàn)了,那說(shuō)明當(dāng)前的隔離級(jí)別是讀已提交了。

可重復(fù)讀中的就是說(shuō)同一個(gè)事務(wù)了多次查詢(xún)返回的數(shù)據(jù)肯定是一樣的,這是毋庸置疑的,這也是與讀已提交的區(qū)別。因此,只有在當(dāng)前事務(wù)提交后,再次查詢(xún)才會(huì)刷新到另一事務(wù)的改變。

那么我理解的幻讀就是,在另一事務(wù)新增數(shù)據(jù)并提交后,此時(shí)的事務(wù)去新增同樣一條數(shù)據(jù),會(huì)報(bào)錯(cuò)的,而此時(shí)再去查詢(xún)又是查無(wú)數(shù)據(jù),這種現(xiàn)象才是幻讀。

更新數(shù)據(jù)層面就是,事務(wù)2已經(jīng)將數(shù)據(jù)的狀態(tài)改變提交了,事務(wù)1用舊的狀態(tài)作為條件去更新,影響行數(shù)會(huì)是0,這也是一種幻讀。 更新已經(jīng)被刪除的數(shù)據(jù),也是影響行數(shù)為0。

數(shù)據(jù)庫(kù)最終的執(zhí)行還是串行的,只是在前置的一些操作可以并發(fā),最終更新到數(shù)據(jù)庫(kù),只能是有一條成功,由于一些規(guī)則的設(shè)置,就會(huì)出現(xiàn)上述的現(xiàn)象了。

4、串行化(沒(méi)有并發(fā)操作)

串行化是最高的隔離級(jí)別,即事務(wù)排隊(duì)串行執(zhí)行了,沒(méi)有了并發(fā)操作,也不會(huì)發(fā)生上述所說(shuō)的臟讀、不可重復(fù)讀、幻讀的現(xiàn)象,這個(gè)的使用場(chǎng)景不多,理解起來(lái)也較為的簡(jiǎn)單。

總結(jié): 數(shù)據(jù)庫(kù)的隔離級(jí)別就是一個(gè)事務(wù)內(nèi),對(duì)于另一事務(wù)的并發(fā)操作會(huì)有怎么樣的效果;

  • 另一事務(wù)操作時(shí)就能看到修改后的數(shù)據(jù),就是讀未提交
  • 另一事務(wù)操作并提交后 能看到修改后的數(shù)據(jù),就是讀已提交
  • 另一事務(wù)操作提交后,當(dāng)前事務(wù)依舊看不到相應(yīng)的修改,事務(wù)開(kāi)始什么數(shù)據(jù),事務(wù)結(jié)束也是讀取到同樣的數(shù)據(jù),就是可重復(fù)讀

所有的事務(wù)都排隊(duì)依次執(zhí)行了,一次只能有一個(gè)進(jìn)行修改,沒(méi)有了并行,就是串行化

Spring事務(wù)隔離級(jí)別比數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別多一個(gè)default

除了上述的四個(gè)隔離級(jí)別,多出來(lái) DEFAULT (默認(rèn))這是一個(gè)PlatfromTransactionManager默認(rèn)的隔離級(jí)別,即使用數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別。另外四個(gè)與JDBC的隔離級(jí)別相對(duì)應(yīng),可以顯性去指定其隔離級(jí)別。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 快速掌握J(rèn)ava8中的Optional

    快速掌握J(rèn)ava8中的Optional

    Optional 是一個(gè)容器類(lèi),代表一個(gè)值存在或不存在,Optional并不是用來(lái)替換所有的null,而是為了在設(shè)計(jì)良好的API中更明確地表達(dá)可能缺失的值,這篇文章主要介紹了Java8的Optional及使用,需要的朋友可以參考下
    2023-07-07
  • Ubuntu16.04 64位下JDK1.7的安裝教程

    Ubuntu16.04 64位下JDK1.7的安裝教程

    這篇文章主要為大家詳細(xì)介紹了Ubuntu16.04 64位下JDK1.7的安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 淺談Java響應(yīng)式系統(tǒng)

    淺談Java響應(yīng)式系統(tǒng)

    第一次聽(tīng)到reactive這個(gè)詞還是在幾年前,偶然了解到了Rxjava這個(gè)項(xiàng)目,仿佛為我打開(kāi)了一扇新的大門(mén),Rxjava是ReactiveX的java實(shí)現(xiàn),ReactiveX家族除了Rxjava還有RxJS, Rx.NET,RxScala等等。
    2021-06-06
  • spring boot上傳文件出錯(cuò)問(wèn)題如何解決

    spring boot上傳文件出錯(cuò)問(wèn)題如何解決

    這篇文章主要介紹了spring boot上傳文件出錯(cuò)問(wèn)題如何解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java 實(shí)戰(zhàn)項(xiàng)目錘煉之樸素風(fēng)格個(gè)人博客系統(tǒng)的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)項(xiàng)目錘煉之樸素風(fēng)格個(gè)人博客系統(tǒng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java+vue+Springboot+ssm+mysql+maven+redis實(shí)現(xiàn)一個(gè)樸素風(fēng)格的個(gè)人博客系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • java實(shí)現(xiàn)簡(jiǎn)單的學(xué)生信息管理系統(tǒng)代碼實(shí)例

    java實(shí)現(xiàn)簡(jiǎn)單的學(xué)生信息管理系統(tǒng)代碼實(shí)例

    這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單的學(xué)生信息管理系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java?stream流中peek用法簡(jiǎn)單示例

    Java?stream流中peek用法簡(jiǎn)單示例

    這篇文章主要給大家介紹了關(guān)于Java?stream流中peek用法的相關(guān)資料,Java Stream中的peek()方法也是用于查看每個(gè)元素,但不改變流的操作的方法,文中通過(guò)代碼介紹的需要的朋友可以參考下
    2023-12-12
  • SWT(JFace) 文本編輯器 實(shí)現(xiàn)代碼

    SWT(JFace) 文本編輯器 實(shí)現(xiàn)代碼

    SWT(JFace) 文本編輯器 實(shí)現(xiàn)代碼
    2009-06-06
  • 詳解@AliasFor注解的使用與注意事項(xiàng)

    詳解@AliasFor注解的使用與注意事項(xiàng)

    @AliasFor注解是在spring源碼當(dāng)中提供的,見(jiàn)名知義,他是為了別名而自定義的注解,下面我們來(lái)看看它的使用與注意事項(xiàng),感興趣的小伙伴可以了解一下
    2023-08-08
  • SpringBoot結(jié)合mybatis-plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐

    SpringBoot結(jié)合mybatis-plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot結(jié)合mybatis-plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐,主要基于MyBatis-Plus 自帶的分頁(yè)插件 PaginationInterceptor,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論