Spring中事務(wù)幾個常見的問題解決
前言
首先,事務(wù)這個概念是數(shù)據(jù)庫層面的,Spring只是基于數(shù)據(jù)庫中的事務(wù)進(jìn)行擴(kuò)展,以及提供了一些能讓程序員更新方便操作事務(wù)的方式
Spring如何處理事務(wù)
Spring中支持編程式事務(wù)和聲明式事務(wù)管理兩種方式
1、編程式事務(wù),可以使用TransactionTemplate
public class B { @Autowired private TransactionTemplate template; public void sout(){ TransactionCallback<Integer> transactionCallback = new TransactionCallback<Integer>() { @Override public Integer doInTransaction(TransactionStatus transactionStatus) { //jdbcTemplate.update //jdbcTemplate.update if(執(zhí)行失敗){ //回滾事務(wù) transactionStatus.setRollbackOnly(); return -1; } return 1; } }; Integer result = template.execute(transactionCallback); }
當(dāng)加了@Transactional注解后,Spring會基于這個類生成一個代理對象,會將這個代理對象作為bean,當(dāng)在使用這個代理對象的方法時,如果這個方法上存在@Transactional注解,那么代理邏輯會先把事務(wù)的自動提交設(shè)置為false,然后再去執(zhí)行原本的業(yè)務(wù)邏輯方法,如果執(zhí)行業(yè)務(wù)邏輯方法沒有出現(xiàn)異常,那么代理邏輯中就會將事務(wù)提交,如果執(zhí)行業(yè)務(wù)邏輯方法出現(xiàn)了異常,那么會將事務(wù)進(jìn)行回滾。
好處:代碼級別的事務(wù)控制,可以自己控制事務(wù)的邏輯,比較靈活
缺點:太麻煩,需要自己實現(xiàn)所有的事務(wù)邏輯
2、聲明式事務(wù)
是Spring在AOP基礎(chǔ)上提供的事務(wù)實現(xiàn)機制。
public class B { @Autowired private TransactionTemplate template; @Transactional public void sout(){ System.out.println("=================A====================="); } }
優(yōu)點:不需要在業(yè)務(wù)代碼中添加事務(wù)管理的代碼,只需要在配置文件中做相關(guān)的事務(wù)規(guī)則聲明規(guī)則就可以了。
缺點:只能只能針對方法級別,無法控制代碼級別。
Spring事務(wù)傳播機制
Propagation:多個事務(wù)方法相互調(diào)用時,事務(wù)是如何在這些方法鍵傳播
方法A是一個事務(wù)方法。方法A在執(zhí)行的過程中調(diào)用了方法B,那么方法B有無事務(wù)以及方法B對事物的要求不同都會對方法A的事務(wù)具體執(zhí)行造成影響,同時方法A的事務(wù)對方法B的事務(wù)執(zhí)行也有影響。這種影響具體是什么就由兩個方法所定義的事務(wù)傳播類型所決定
a調(diào)用b,以下描述,當(dāng)前均只a,自己均指b
- REQUIRED(Spring默認(rèn)的事務(wù)傳播類型):如果當(dāng)前沒有事務(wù),則自己新建一個事務(wù),如果當(dāng)前存在事務(wù),則加入這個事務(wù)。
- SUPPORTS:當(dāng)前存在事務(wù),則加入當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方法執(zhí)行
- MANDATORY:當(dāng)前存在事務(wù),則加入當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),則拋出異常
- REQUIRES_NEW:創(chuàng)建一個新事務(wù),如果存在當(dāng)前事務(wù),則掛起該事務(wù)(互不干擾)
- NOT_SUPPORTED:以非事務(wù)方法執(zhí)行,如果當(dāng)前存在事務(wù),則掛起當(dāng)前事務(wù)。
- NEVER:不使用事務(wù),如果當(dāng)前存在事務(wù),則拋出異常
- NESTED:如果當(dāng)前存在事務(wù),則嵌套事務(wù)中執(zhí)行,否則REQUIRED操作一樣(開啟一個事務(wù))
和REQUIRES_NEW的區(qū)別:
REQUIRES_NEW是新建一個事務(wù),并且新開啟的事務(wù)與原事務(wù)無關(guān),而NESTED則是當(dāng)前存在事務(wù)時(我們把當(dāng)前事務(wù)成為父事務(wù))會開啟一個嵌套事務(wù)(稱之為一個子事務(wù))。在NESTED情況下父事務(wù)回滾時,子事務(wù)也會回滾,而在REQUIRES_NEW情況下,原有事務(wù)回滾,不會影響新開啟的子事務(wù)。
和REQUIRED的區(qū)別:
REQUIRED情況下,調(diào)用方存在事務(wù)時,則被調(diào)用和調(diào)用方法使用同一事務(wù),那么被調(diào)用方出現(xiàn)異常時,由于共用一個事務(wù),所以無論調(diào)用方法是否catch異常,事務(wù)都會回滾(父子事務(wù)一起回滾),而在NESTED情況下,被調(diào)用方發(fā)生異常時,調(diào)用發(fā)可以catch其異常,這樣只有子事務(wù)回滾,父事務(wù)不受影響(父事務(wù)是否需要回滾可以自行決定)
Spring事務(wù)隔離級別
- ISOLATION:Spring的事務(wù)隔離級別
- DEFAULT:使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級別
- READ_UNCOMMITTED:讀未提交,允許事務(wù)在執(zhí)行過程中,讀取其他事務(wù)未提交的數(shù)據(jù)
- READ_COMMITTED:讀已提交,允許事務(wù)在執(zhí)行過程中,讀取其他事務(wù)已提交的數(shù)據(jù)
- REPEATABLE_READ:可重復(fù)讀,在同一個事務(wù)內(nèi),任意時刻的查詢結(jié)果是一致的
- SERIALIZABLE:所有事務(wù)依次執(zhí)行
數(shù)據(jù)庫配置的隔離級別是read commited,而spring配置的隔離級別是repeatable read,這個時候隔離級別以哪個為準(zhǔn)?
以Spring為準(zhǔn)(spring配置的會覆蓋數(shù)據(jù)庫的隔離級別),如果Spring配置的隔離級別數(shù)據(jù)庫不支持,效果取決于數(shù)據(jù)庫
到此這篇關(guān)于Spring中事務(wù)幾個常見的問題解決的文章就介紹到這了,更多相關(guān)Spring事務(wù) 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
feign服務(wù)端發(fā)現(xiàn)異??蛻舳颂幚淼姆椒ń榻B
這篇文章主要給大家介紹了關(guān)于feign服務(wù)端發(fā)現(xiàn)異??蛻舳颂幚淼姆椒ǎ闹型ㄟ^示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用feign具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07SpringBoot常用讀取配置文件的3種方法小結(jié)
本文主要介紹了SpringBoot常用讀取配置文件的3種方法小結(jié),主要包括@Value讀取配置文件,@ConfigurationProperties 讀取配置文件和讀取配置文件中的List,具有一定的參考價值,感興趣的可以了解一下2023-10-10java Spring 5 新特性函數(shù)式Web框架詳細(xì)介紹
正如昨天Juergen博客中所提到的,Spring 5.0的第二個里程碑是引入了一個新的函數(shù)式web框架。在這篇文章中,我們將給出關(guān)于這個框架的更多信息,,需要的朋友可以參考下2016-12-12