国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Spring面試】八、事務(wù)相關(guān)

這篇具有很好參考價(jià)值的文章主要介紹了【Spring面試】八、事務(wù)相關(guān)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Q1、事務(wù)的四大特性是什么?

答案:

即ACID:

  • 原子性,Atomicity,即事務(wù)包含的所有操作要么同成功,要么同失敗
  • 一致性,Cosistency,即事務(wù)必須使得數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)到兩一個(gè)一致性狀態(tài)。如用戶A和用戶B兩者的錢加起來一共5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢相加來應(yīng)該還得是5000,這就是事務(wù)的一致性
  • 隔離性,Isolation,多個(gè)事務(wù)并發(fā)時(shí),之間要相互隔離,不能被其他事務(wù)干擾
  • 持久性,Durability,事務(wù)一旦提交,對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就是永久的,即使數(shù)據(jù)庫(kù)故障也不會(huì)丟失提交事務(wù)的操作

Q2、Spring支持的事務(wù)管理類型有哪些?Spring事務(wù)實(shí)現(xiàn)方式有哪些?

答案: 支持的事務(wù)管理類型有兩種

Spring支持兩種類型的事務(wù)管理:

  • 編程式事務(wù)管理:靈活性高,但難維護(hù)
@Autowired
TransactionTemplate transactionTemplate ;

【Spring面試】八、事務(wù)相關(guān),面試,spring,數(shù)據(jù)庫(kù),sql

  • 聲明式事務(wù)管理:業(yè)務(wù)代碼和事務(wù)管理分離,只需用注解和xml配置來管理事務(wù)。以下為基于注解@Transactional

【Spring面試】八、事務(wù)相關(guān),面試,spring,數(shù)據(jù)庫(kù),sql

答案: 實(shí)現(xiàn)聲明式事務(wù)的三種方式

  • 基于接口:Spring早期版本時(shí)用,更接近底層源碼,有基于TransactionInterceptor的聲明式事務(wù),基于TransactionProxyFactoryBean的聲明式事務(wù)
  • 基于<tx>和<aop>的xml聲明式事務(wù)管理:和Spring AOP結(jié)合,利用切點(diǎn)表達(dá)式使得事務(wù)管理更加靈活
  • 基于@Transactional的全注解方式:在需要實(shí)施事務(wù)管理的方法或者類上加@Transactional注解,指定事務(wù)規(guī)則即可實(shí)現(xiàn)事務(wù)管理

Q3、說一下Spring的事務(wù)傳播行為

答案:

兩個(gè)事務(wù)方法之間的嵌套調(diào)用時(shí),這個(gè)事務(wù)方法如何進(jìn)行,即事務(wù)的傳播特性。

@Transactional
public void trans(){
	sub();
	log();
	query();

}

@Transactional //SUPPORTS
public info query(){

}

@Transactional //REQUIRES_NEW
public void log(){

}

【Spring面試】八、事務(wù)相關(guān),面試,spring,數(shù)據(jù)庫(kù),sql

以上面的query方法為例,其用SUPPORTS,即單獨(dú)執(zhí)行時(shí)不開啟事務(wù)(就一個(gè)查詢,當(dāng)然不用開啟),被有事務(wù)的外部方法調(diào)用時(shí),則融入到這個(gè)外部方法的事務(wù)中,與他們同成功,同失敗。(到大學(xué)了,和其余室友住一個(gè)屋子,還是你自己外面租一個(gè)新房子)

Q4、說一下Spring的事務(wù)隔離

答案:

事務(wù)隔離用來解決并發(fā)事務(wù)所產(chǎn)生的一些問題:

  • 臟讀
  • 不可重復(fù)讀
  • 幻影讀

通過設(shè)置不同的隔離級(jí)別,可解決以上問題。

臟讀:

【Spring面試】八、事務(wù)相關(guān),面試,spring,數(shù)據(jù)庫(kù),sql

事務(wù)2只是改了余額,但并未提交,事務(wù)1就把這個(gè)沒提交的值讀走了,如果以后事務(wù)2最終回滾,就出問題了。即一個(gè)事務(wù)讀取了另一個(gè)事務(wù)中沒有提交的數(shù)據(jù),會(huì)在本事務(wù)中產(chǎn)生數(shù)據(jù)不一致的問題。

@Transactional(isolation = isolation.READ_COMMITTED)

設(shè)置事務(wù)隔離策略為讀已提交,只讀別的并發(fā)事務(wù)已提交的修改。

不可重復(fù)讀:

【Spring面試】八、事務(wù)相關(guān),面試,spring,數(shù)據(jù)庫(kù),sql
事務(wù)1先讀后去處理其他事兒,然后期間事務(wù)2修改并commit,等事務(wù)1再讀,則產(chǎn)生數(shù)據(jù)不一致的問題。

@Transactional(isolation = isolation.REPEATABLE_READ)

設(shè)置事務(wù)隔離策略為可重復(fù)讀REPEATABLE_READ,確保事務(wù)1可以多次從一個(gè)字段中讀到相同的值,即事務(wù)1執(zhí)行期間禁止其他事務(wù)對(duì)這個(gè)字段進(jìn)行更新(行鎖)。

幻影讀:

不可重復(fù)讀是針對(duì)一行數(shù)據(jù),而幻影讀則是針對(duì)整個(gè)表,比如兩次讀取,表中多出了一行數(shù)據(jù):

【Spring面試】八、事務(wù)相關(guān),面試,spring,數(shù)據(jù)庫(kù),sql
一個(gè)事務(wù)所在的方法中,多次進(jìn)行整表數(shù)據(jù)讀取,結(jié)果不一樣,產(chǎn)生數(shù)據(jù)不一致問題。

@Transactional(isolation = isolation.SERIALIZABLE)

需要設(shè)置事務(wù)級(jí)別為串行化SERIALIZABLE,確保事務(wù)1可以多次從一個(gè)表中讀到相同的行數(shù),事務(wù)1執(zhí)行期間,禁止其他事務(wù)對(duì)這個(gè)表進(jìn)行增刪改,但這樣性能十分低下(表鎖)

最后,當(dāng)不設(shè)置事務(wù)隔離級(jí)別時(shí),將默認(rèn)使用底層所選數(shù)據(jù)庫(kù)自身的默認(rèn)事務(wù)隔離級(jí)別。

SELECT @@tx_isolation;

Q5、Spring事務(wù)的實(shí)現(xiàn)原理

以JavaConfig的方式為例,使用是:

//啟動(dòng)事務(wù),這樣可以使用@Transactional注解
@EnableTransactionManagement

答案:

沒有Spring之前,單靠JDBC來操作是這樣的:


try {
	//...
    //將事務(wù)提交機(jī)制改為手動(dòng)提交
    conn.setAutoCommit(false);
    
    //業(yè)務(wù)邏輯
  
    //在這里事務(wù)結(jié)束,手動(dòng)提交數(shù)據(jù)
    conn.commit();

}

Spring事務(wù)是把上面業(yè)務(wù)邏輯前后的事務(wù)開啟與提交用AOP包了一下,即原理是:Spring事務(wù)底層是基于數(shù)據(jù)庫(kù)事務(wù)和AOP機(jī)制。

  • 為使用了@Transactional注解的Bean創(chuàng)建一個(gè)動(dòng)態(tài)代理對(duì)象(bean初始化后調(diào)用bean的后置處理器來創(chuàng)建動(dòng)態(tài)代理)
  • 如果是事務(wù)方法(類上面、接口上面、方法上面、接口方法上面),則開啟事務(wù):
try{
	- 創(chuàng)建數(shù)據(jù)庫(kù)連接
	- 修改數(shù)據(jù)庫(kù)連接的autocommit屬性為false,禁止此連接自動(dòng)提交
	- 執(zhí)行當(dāng)前方法,方法中會(huì)執(zhí)行數(shù)據(jù)庫(kù)操作的業(yè)務(wù)SQL
	- 
}catch{
	- 若出現(xiàn)異常,且這個(gè)異常需要回滾,則回滾事務(wù)
}
  • 沒有發(fā)生異常,則提交事務(wù)

Q6、Spring事務(wù)傳播行為的實(shí)現(xiàn)原理是什么?

答案:

Spring的事務(wù)信息是存于ThreadLocal中的,所以一個(gè)線程永遠(yuǎn)只能有一個(gè)事務(wù)。對(duì)于被調(diào)用的事務(wù)方法,當(dāng):

  • 融入:當(dāng)傳播行為是融入外部事務(wù),則拿到ThreadLocal中的Connection,共享一個(gè)數(shù)據(jù)庫(kù)連接,來共同提交與回滾
  • 創(chuàng)建新事務(wù):當(dāng)傳播行為是創(chuàng)建新的事務(wù),則會(huì)把嵌套的新事務(wù)存入ThreadLocal,再將外部暫存起來,當(dāng)嵌套事務(wù)提交或回滾后,再將暫存的外部事務(wù)信息恢復(fù)到ThreadLocal來提交或回滾

詳細(xì)流程:

  • 外部:創(chuàng)建數(shù)據(jù)庫(kù)連接Connection并存入ThreadLocal,修改數(shù)據(jù)庫(kù)連接的autocommit屬性為false
  • 外部:返回事務(wù)狀態(tài)信息(TransactionInfo.newTransaction=true)
  • 外部:往下執(zhí)行方法,中途發(fā)現(xiàn)內(nèi)部調(diào)用了另一個(gè)事務(wù)方法
  • 內(nèi)嵌:判斷當(dāng)前ThreadLoacl是否已有Connection,有即是內(nèi)嵌事務(wù),需要判斷事務(wù)傳播行為,到此分兩種情況

情況一,當(dāng)傳播行為是融入

  • 不會(huì)創(chuàng)建connection,返回事務(wù)狀態(tài)信息(TransactionInfo.newTransaction=false),即不是一個(gè)新事務(wù)
  • 內(nèi)部被調(diào)用的事務(wù)方法開始執(zhí)行相關(guān)SQL
  • 執(zhí)行完后,判斷TransactionInfo.newTransaction是否為true,此時(shí)是融入,這個(gè)值為false,不提交
  • 內(nèi)部被調(diào)用的事務(wù)方法執(zhí)行完成
  • 外部方法繼續(xù)往下執(zhí)行
  • 執(zhí)行完后判斷TransactionInfo.newTransaction是否為true,外部為true
  • 拿到ThreadLocal中的connection進(jìn)行提交

情況二,當(dāng)傳播行為是創(chuàng)建新的事務(wù)

  • 把外層方法事務(wù)相關(guān)的事務(wù)信息(包括connection、隔離級(jí)別、是否只讀…)暫存到TransactionInfo中,同時(shí)會(huì)把ThreadLocal中的事務(wù)信息置空
  • 創(chuàng)建新的connection,返回事務(wù)狀態(tài)信息(TransactionInfo.newTransaction=true),即新事務(wù),并放入ThreadLocal當(dāng)中
  • 內(nèi)部被調(diào)用的事務(wù)方法往下執(zhí)行
  • 執(zhí)行完后判斷TransactionInfo.newTransaction是否為true?是?于是提交
  • 判斷是否暫存了事務(wù) ? 是? 再把上面暫存的外部方法的事務(wù)信息放回ThreadLocal中
  • 內(nèi)部被調(diào)用的事務(wù)方法執(zhí)行完成
  • 外部事務(wù)方法接著執(zhí)行
  • 執(zhí)行完后判斷TransactionInfo.newTransaction是否為true,外部為true
  • 拿到ThreadLocal中的connection進(jìn)行提交

Q7、Spring多線程事務(wù),能否保證事務(wù)的一致性?

【Spring面試】八、事務(wù)相關(guān),面試,spring,數(shù)據(jù)庫(kù),sql
問題分析:兩個(gè)事務(wù)方法A和B,在兩個(gè)線程中,對(duì)應(yīng)的事務(wù)能否同時(shí)提交或回滾?

答案:

Spring不支持,因?yàn)镾pring事務(wù)信息存于ThreadLocal中的Connection,一個(gè)線程永遠(yuǎn)只能有一個(gè)事務(wù),所以無法實(shí)現(xiàn)兩個(gè)事務(wù)的一致性??梢酝ㄟ^編程式事務(wù)自己控制或者分布式事務(wù)來解決(二階段提交的方式)。

Q8、Spring事務(wù)失效的原因?

【Spring面試】八、事務(wù)相關(guān),面試,spring,數(shù)據(jù)庫(kù),sql
Spring事務(wù)底層是基于數(shù)據(jù)庫(kù)事務(wù)和AOP機(jī)制,因此,參考AOP失效,可以知道Spring事務(wù)失效的原因:

答案:

  • 方法的內(nèi)部調(diào)用導(dǎo)致事務(wù)傳播失效

【Spring面試】八、事務(wù)相關(guān),面試,spring,數(shù)據(jù)庫(kù),sql

  • 方法是private會(huì)失效,解決: 改成public
  • 目標(biāo)類沒有配置為Bean也會(huì)失效 解決: 配置為Bean,交給Spring管理
  • 自己捕獲了異常 解決: 不要捕獲處理
  • 使用cglib動(dòng)態(tài)代理,但是@Transactional聲明在接口上面

后面幾種本質(zhì)上是使用不當(dāng)導(dǎo)致的失效。文章來源地址http://www.zghlxwxcb.cn/news/detail-732499.html

到了這里,關(guān)于【Spring面試】八、事務(wù)相關(guān)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Spring面試】八、事務(wù)相關(guān)

    【Spring面試】八、事務(wù)相關(guān)

    答案: 即ACID: 原子性 ,Atomicity,即事務(wù)包含的所有操作要么同成功,要么同失敗 一致性 ,Cosistency,即事務(wù)必須使得數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)到兩一個(gè)一致性狀態(tài)。如用戶A和用戶B兩者的錢加起來一共5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢相

    2024年02月07日
    瀏覽(26)
  • 【建議收藏】數(shù)據(jù)庫(kù) SQL 入門——事務(wù)(內(nèi)附演示)

    【建議收藏】數(shù)據(jù)庫(kù) SQL 入門——事務(wù)(內(nèi)附演示)

    ???♂?作者簡(jiǎn)介:生魚同學(xué),大數(shù)據(jù)科學(xué)與技術(shù)專業(yè)碩士在讀?????,曾獲得華為杯數(shù)學(xué)建模國(guó)家二等獎(jiǎng)??,MathorCup 數(shù)學(xué)建模競(jìng)賽國(guó)家二等獎(jiǎng)??,亞太數(shù)學(xué)建模國(guó)家二等獎(jiǎng)??。 ??研究方向:復(fù)雜網(wǎng)絡(luò)科學(xué) ??興趣方向:利用python進(jìn)行數(shù)據(jù)分析與機(jī)器學(xué)習(xí),數(shù)學(xué)建模競(jìng)

    2023年04月23日
    瀏覽(25)
  • 數(shù)據(jù)庫(kù)相關(guān)面試題

    數(shù)據(jù)庫(kù)相關(guān)面試題

    鞏固基礎(chǔ),砥礪前行 。 只有不斷重復(fù),才能做到超越自己。 能堅(jiān)持把簡(jiǎn)單的事情做到極致,也是不容易的。 mysql怎么優(yōu)化 : MySQL的優(yōu)化可以從以下幾個(gè)方面入手: 數(shù)據(jù)庫(kù)設(shè)計(jì)優(yōu)化:合理設(shè)計(jì)表結(jié)構(gòu),選擇合適的數(shù)據(jù)類型,規(guī)范化表結(jié)構(gòu),避免冗余數(shù)據(jù)等。 索引優(yōu)化:為經(jīng)常

    2024年02月12日
    瀏覽(18)
  • Sql Server 數(shù)據(jù)庫(kù)事務(wù)與鎖,同一事務(wù)更新又查詢鎖?期望大家來解惑

    Sql Server 數(shù)據(jù)庫(kù)事務(wù)與鎖,同一事務(wù)更新又查詢鎖?期望大家來解惑

    我有一個(gè)People表,有三行數(shù)據(jù): 如果我們沒詳細(xì)了解數(shù)據(jù)庫(kù)事務(wù)執(zhí)行加鎖的過程中,會(huì)不會(huì)有這樣一個(gè)疑問:如下的這段 SQL 開啟了事務(wù),并且在事務(wù)中進(jìn)行了更新和查詢操作。 我們知道sql server數(shù)據(jù)庫(kù)的默認(rèn)事務(wù)級(jí)別是READ COMMITTED(已提交的讀?。?,我們?cè)倏匆幌乱烟峤蛔x事

    2024年02月01日
    瀏覽(24)
  • 數(shù)據(jù)庫(kù)索引面試的相關(guān)問題

    數(shù)據(jù)庫(kù)索引面試的相關(guān)問題

    查看索引的執(zhí)行計(jì)劃 索引失效的情況 1、索引列上做了計(jì)算,函數(shù),類型轉(zhuǎn)換等操作。索引失效是因?yàn)椴樵冞^程需要掃描整個(gè)索引并回表。代價(jià)高于直接全表掃描。 Like匹配使用了前綴匹配符“%abc” 字符串不加引號(hào)導(dǎo)致類型轉(zhuǎn)換。 原因: 常見索引的優(yōu)化的方法 1、前綴索引

    2024年02月22日
    瀏覽(24)
  • 數(shù)據(jù)庫(kù)SQL查詢相關(guān)練習(xí)

    1、顯示所有職工的基本信息。 2、查詢所有職工所屬部門的部門號(hào),不顯示重復(fù)的部門號(hào)。 3、求出所有職工的人數(shù)。 4、列出最高工和最低工資。 5、列出職工的平均工資和總工資。 6、創(chuàng)建一個(gè)只有職工號(hào)、姓名和參加工作的新表,名為工作日期表。 8、列出所有姓劉的職工

    2024年01月25日
    瀏覽(19)
  • Sql Server 數(shù)據(jù)庫(kù)事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

    Sql Server 數(shù)據(jù)庫(kù)事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

    我有一個(gè)People表,有三行數(shù)據(jù): 如果我們沒詳細(xì)了解數(shù)據(jù)庫(kù)事務(wù)執(zhí)行加鎖的過程中,會(huì)不會(huì)有這樣一個(gè)疑問:如下的這段 SQL 開啟了事務(wù),并且在事務(wù)中進(jìn)行了更新和查詢操作。 我們知道sql server數(shù)據(jù)庫(kù)的默認(rèn)事務(wù)級(jí)別是READ COMMITTED(已提交的讀取),我們?cè)倏匆幌乱烟峤蛔x事

    2024年02月01日
    瀏覽(66)
  • 【SQL Server】數(shù)據(jù)庫(kù)開發(fā)指南(八)高級(jí)數(shù)據(jù)處理技術(shù) MS-SQL 事務(wù)、異常和游標(biāo)的深入研究

    【SQL Server】數(shù)據(jù)庫(kù)開發(fā)指南(八)高級(jí)數(shù)據(jù)處理技術(shù) MS-SQL 事務(wù)、異常和游標(biāo)的深入研究

    本系列博文還在更新中,收錄在專欄:#MS-SQL Server 專欄中。 本系列文章列表如下: 【SQL Server】 Linux 運(yùn)維下對(duì) SQL Server 進(jìn)行安裝、升級(jí)、回滾、卸載操作 【SQL Server】數(shù)據(jù)庫(kù)開發(fā)指南(一)數(shù)據(jù)庫(kù)設(shè)計(jì)的核心概念和基本步驟 【SQL Server】數(shù)據(jù)庫(kù)開發(fā)指南(二)MSSQL數(shù)據(jù)庫(kù)開發(fā)對(duì)

    2024年02月07日
    瀏覽(104)
  • MySQL相關(guān)的SQL語句、數(shù)據(jù)庫(kù)、數(shù)據(jù)表、字段、類型

    1、 SQL 語句不區(qū)分大小寫。 SQL語句 用途 描述 mysql -u root -p 連接 MySQL 在命令行窗口中輸入 mysql -u root -p 命令,回車,然后輸入 MySQL 密碼(不要忘記了密碼,找回麻煩),再回車就連接上 MySQL 了。最初都是使用 root 用戶登錄,工作中不能一直使用 root 用戶登錄。因?yàn)?root 權(quán)限太

    2024年02月13日
    瀏覽(116)
  • 【Spring】Spring的數(shù)據(jù)庫(kù)開發(fā)

    1.1 Spring JdbcTemplate的解析 ????針對(duì)數(shù)據(jù)庫(kù)的操作,Spring框架提供了 JdbcTemplate 類,該類是Spring框架數(shù)據(jù)抽象層的基礎(chǔ),其他更高層次的抽象類是構(gòu)建于JdbcTemplate類之上的??梢哉f,JdbcTemplate類是Spring JDBC的核心類。JdbcTemplate類的繼承關(guān)系十

    2023年04月23日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包