一文帶你讀懂SpringBoot中的事務(wù)管理?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
在鹽城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,鹽城網(wǎng)站建設(shè)費(fèi)用合理。
Springboot內(nèi)部提供的事務(wù)管理器是根據(jù)autoconfigure來(lái)進(jìn)行決定的。
比如當(dāng)使用jpa的時(shí)候,也就是pom中加入了spring-boot-starter-data-jpa這個(gè)starter之后。
Springboot會(huì)構(gòu)造一個(gè)JpaTransactionManager這個(gè)事務(wù)管理器。
而當(dāng)我們使用spring-boot-starter-jdbc的時(shí)候,構(gòu)造的事務(wù)管理器則是DataSourceTransactionManager。
這2個(gè)事務(wù)管理器都實(shí)現(xiàn)了spring中提供的PlatformTransactionManager接口,這個(gè)接口是spring的事務(wù)核心接口。
這個(gè)核心接口有以下這幾個(gè)常用的實(shí)現(xiàn)策略:
HibernateTransactionManager DataSourceTransactionManager JtaTransactionManager JpaTransactionManager
具體的PlatformTransactionManager繼承關(guān)系如下:
spring-boot-starter-data-jpa這個(gè)starter會(huì)觸發(fā)HibernateJpaAutoConfiguration這個(gè)自動(dòng)化配置類,HibernateJpaAutoConfiguration繼承了JpaBaseConfiguration基礎(chǔ)類。
在JpaBaseConfiguration中構(gòu)造了事務(wù)管理器:
@Bean @ConditionalOnMissingBean(PlatformTransactionManager.class) public PlatformTransactionManager transactionManager() { return new JpaTransactionManager(); }
spring-boot-starter-jdbc會(huì)觸發(fā)DataSourceTransactionManagerAutoConfiguration這個(gè)自動(dòng)化配置類,也會(huì)構(gòu)造事務(wù)管理器:
@Bean @ConditionalOnMissingBean(PlatformTransactionManager.class) @ConditionalOnBean(DataSource.class) public DataSourceTransactionManager transactionManager() { return new DataSourceTransactionManager(this.dataSource); }
Spring的事務(wù)管理器PlatformTransactionManager接口中定義了3個(gè)方法:
// 基于事務(wù)的傳播特性,返回一個(gè)已經(jīng)存在的事務(wù)或者創(chuàng)建一個(gè)新的事務(wù) TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; // 提交事務(wù) void commit(TransactionStatus status) throws TransactionException; // 回滾事務(wù) void rollback(TransactionStatus status) throws TransactionException;
其中TransactionDefinition接口表示跟spring兼容的事務(wù)屬性,比如傳播行為、隔離級(jí)別、超時(shí)時(shí)間、是否只讀等屬性。
DefaultTransactionDefinition類是一個(gè)默認(rèn)的TransactionDefinition實(shí)現(xiàn),它的傳播行為是PROPAGATION_REQUIRED(如果當(dāng)前沒(méi)事務(wù),則創(chuàng)建一個(gè),否則加入到當(dāng)前事務(wù)中),隔離級(jí)別是數(shù)據(jù)庫(kù)默認(rèn)級(jí)別。
TransactionStatus接口表示事務(wù)的狀態(tài),比如事務(wù)是否是一個(gè)剛構(gòu)造的事務(wù)、事務(wù)是否已經(jīng)完成等狀態(tài)。
下面這段代碼就是傳統(tǒng)事務(wù)的常見(jiàn)寫(xiě)法:
transaction.begin(); try { ... transaction.commit(); } catch(Exception e) { ... transaction.rollback(); } finally { }
由于spring的事務(wù)操作被封裝到了PlatformTransactionManager接口中,commit和rollback方法對(duì)應(yīng)接口中的方法,begin方法在getTransaction方法中會(huì)被調(diào)用。
細(xì)心的讀者發(fā)現(xiàn)文章前面構(gòu)造事務(wù)管理器的時(shí)候都會(huì)加上這段注解:
@ConditionalOnMissingBean(PlatformTransactionManager.class)
也就是說(shuō)如果我們手動(dòng)配置了事務(wù)管理器,Springboot就不會(huì)再為我們自動(dòng)配置事務(wù)管理器。
如果要使用多個(gè)事務(wù)管理器的話,那么需要手動(dòng)配置多個(gè):
@Configuration public class DatabaseConfiguration { @Bean public PlatformTransactionManager transactionManager1(EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } @Bean public PlatformTransactionManager transactionManager2(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
然后使用Transactional注解的時(shí)候需要聲明是哪個(gè)事務(wù)管理器:
@Transactional(value="transactionManager1") public void save() { doSave(); }
Spring給我們提供了一個(gè)TransactionManagementConfigurer接口,該接口只有一個(gè)方法返回PlatformTransactionManager。其中返回的PlatformTransactionManager就表示這是默認(rèn)的事務(wù)處理器,這樣在Transactional注解上就不需要聲明是使用哪個(gè)事務(wù)管理器了。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。