最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot手動(dòng)開啟事務(wù):DataSourceTransactionManager問題

 更新時(shí)間:2023年07月06日 16:52:58   作者:cying2029  
這篇文章主要介紹了SpringBoot手動(dòng)開啟事務(wù):DataSourceTransactionManager問題,具有很好的價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

DataSourceTransactionManager

添加事務(wù):

  • 傳統(tǒng)JDBC事務(wù)管理,使用DataSource從數(shù)據(jù)源中獲取connection
  • 通過api進(jìn)行CRUD,之后手動(dòng)commit、rollback。
  • 應(yīng)用spring提供的編程式的事務(wù)管理
  • 使用spring的聲明式事務(wù)處理

Spring的事務(wù)處理中,通用的事務(wù)處理流程是由抽象事務(wù)管理器AbstractPlatformTransactionManager來提供的,而具體的底層事務(wù)處理實(shí)現(xiàn),由PlatformTransactionManager的具體實(shí)現(xiàn)類來實(shí)現(xiàn),如 DataSourceTransactionManager 、JtaTransactionManager和 HibernateTransactionManager等。

SpringBoot中手動(dòng)開啟事務(wù)常用代碼

@Controller
public class TransactionDemo {
    @Autowired
    private DataSourceTransactionManager transactionManager;
    @RequestMapping("test")
    public void test(){
        //可做單例
        DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
        definition.setPropagationBehaviorName("PROPAGATION_REQUIRED");
        TransactionStatus transaction = transactionManager.getTransaction(definition);
//        TransactionStatus transaction = transactionManager.getTransaction(TransactionDefinition.withDefaults());
        try {
            //do something
            transactionManager.commit(transaction);
        }catch (Exception e){
            //do error
            transactionManager.rollback(transaction);
        }
    }
}

DataSourceTransactionManager總結(jié)

1.Spring框架配置事務(wù)

1.1基于schema的自動(dòng)代理

<beans xmlns="http://www.springframework.org/schema/beans"
? ? ? ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
? ? ? ?xmlns:p="http://www.springframework.org/schema/p"
? ? ? ?xmlns:tx="http://www.springframework.org/schema/tx"
? ? ? ?xmlns:aop="http://www.springframework.org/schema/aop"
? ? ? ?xsi:schemaLocation="http://www.springframework.org/schema/beans
? ? ? ? http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
? ? ? ? http://www.springframework.org/schema/aop
? ? ? ? http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
? ? ? ? http://www.springframework.org/schema/tx
? ? ? ? http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
? ? <!--對(duì)數(shù)據(jù)源進(jìn)行代理,使數(shù)據(jù)源具有感知事務(wù)上下文的能力,當(dāng)某些場景下顯示獲取數(shù)據(jù)庫連接時(shí),保證獲取到的連接是綁定了當(dāng)前事務(wù)的連接(和通過DataSourceUtils.getConnection()獲取連接的效果一致)-->
? ? <bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"
? ? ? ? p:targetDataSource-ref="dataSource"/>
? ? <!--聲明式事務(wù)管理器-->
? ? <bean id="txManager"
? ? ? ? ? class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
? ? ? ? p:dataSource-ref="dataSourceProxy"/>
? ? <!--基于schema的自動(dòng)代理-->
? ? <aop:config>
? ? ? ? <!--切點(diǎn) 匹配com.fxy子包下的所有方法-->
? ? ? ? <aop:pointcut id="serviceMethod"
? ? ? ? ? ? ? ? ? ? ? expression="execution(* com.fxy..*.*.service..*.*(..))"/>
? ? ? ? <!--切面-->
? ? ? ? <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>
? ? </aop:config>
? ? <!--增強(qiáng) 新增變更刪除方法 遇到檢查型異常和非檢查型異常均回滾-->
? ? <tx:advice id="txAdvice" transaction-manager="txManager">
? ? ? ? <tx:attributes>
? ? ? ? ? ? <tx:method name="get*" read-only="true"/>
? ? ? ? ? ? <tx:method name="list*" read-only="true"/>
? ? ? ? ? ? <tx:method name="save*" rollback-for="Exception"/>
? ? ? ? ? ? <tx:method name="update*" rollback-for="Exception"/>
? ? ? ? ? ? <tx:method name="delete*" rollback-for="Exception"/>
? ? ? ? ? ? <tx:method name="*" rollback-for="Exception"/>
? ? ? ? </tx:attributes>
? ? </tx:advice>
</beans>

查看tx:advice標(biāo)簽,可以追蹤到TransactionInterceptor類,其實(shí)現(xiàn)了MethodInterceptor接口,會(huì)在目標(biāo)方法前后實(shí)施增強(qiáng)(即使用txManager,在方法執(zhí)行前關(guān)閉Connection對(duì)象自動(dòng)提交,方法執(zhí)行完成后執(zhí)行Connection對(duì)象提交方法,異常時(shí)執(zhí)行Connection對(duì)象回滾方法)。

1.2使用@transactional注解

<beans xmlns="http://www.springframework.org/schema/beans"
? ? ? ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
? ? ? ?xmlns:p="http://www.springframework.org/schema/p"
? ? ? ?xmlns:tx="http://www.springframework.org/schema/tx"
? ? ? ?xmlns:aop="http://www.springframework.org/schema/aop"
? ? ? ?xsi:schemaLocation="http://www.springframework.org/schema/beans
? ? ? ? http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
? ? ? ? http://www.springframework.org/schema/aop
? ? ? ? http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
? ? ? ? http://www.springframework.org/schema/tx
? ? ? ? http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
? ? <!--對(duì)數(shù)據(jù)源進(jìn)行代理,使數(shù)據(jù)源具有感知事務(wù)上下文的能力,當(dāng)某些場景下顯示獲取數(shù)據(jù)庫連接時(shí),保證獲取到的連接是綁定了當(dāng)前事務(wù)的連接(和通過DataSourceUtils.getConnection()獲取連接的效果一致)-->
? ? <bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"
? ? ? ? p:targetDataSource-ref="dataSource"/>
? ? <!--聲明式事務(wù)管理器-->
? ? <bean id="txManager"
? ? ? ? ? class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
? ? ? ? p:dataSource-ref="dataSourceProxy"/>
? ? <!--對(duì)使用transactional注解的bean進(jìn)行加工,織入事務(wù)管理切面 -->
? ? <tx:annotation-driven transaction-manager="txManager"/>
</beans>

2.SpringBoot框架配置事務(wù)

2.1@Transactional注解

2.1.1SpringBoot自動(dòng)裝配事務(wù)管理器

package org.springframework.boot.autoconfigure.jdbc;
import javax.sql.DataSource;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.support.JdbcTransactionManager;
import org.springframework.transaction.TransactionManager;
@Configuration(
? ? proxyBeanMethods = false
)
@ConditionalOnClass({JdbcTemplate.class, TransactionManager.class})
@AutoConfigureOrder(2147483647)
@EnableConfigurationProperties({DataSourceProperties.class})
public class DataSourceTransactionManagerAutoConfiguration {
?? ?public DataSourceTransactionManagerAutoConfiguration() {
? ? }
? ? @Configuration(
? ? ? ? proxyBeanMethods = false
? ? )
? ? @ConditionalOnSingleCandidate(DataSource.class)
? ? static class JdbcTransactionManagerConfiguration {
? ? ? ? JdbcTransactionManagerConfiguration() {
? ? ? ? }
? ? ? ? @Bean
? ? ? ? @ConditionalOnMissingBean({TransactionManager.class})
? ? ? ? DataSourceTransactionManager transactionManager(Environment environment, DataSource dataSource, ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
? ? ? ? ? ? DataSourceTransactionManager transactionManager = this.createTransactionManager(environment, dataSource);
? ? ? ? ? ? transactionManagerCustomizers.ifAvailable((customizers) -> {
? ? ? ? ? ? ? ? customizers.customize(transactionManager);
? ? ? ? ? ? });
? ? ? ? ? ? return transactionManager;
? ? ? ? }
? ? ? ? private DataSourceTransactionManager createTransactionManager(Environment environment, DataSource dataSource) {
? ? ? ? ? ? return (DataSourceTransactionManager)((Boolean)environment.getProperty("spring.dao.exceptiontranslation.enabled", Boolean.class, Boolean.TRUE) ? new JdbcTransactionManager(dataSource) : new DataSourceTransactionManager(dataSource));
? ? ? ? }
? ? }
}

2.2SpringBoot多數(shù)據(jù)源配置

2.2.1給數(shù)據(jù)源指定事務(wù)管理器

? ?@Bean("db1TxManager")
? ?public DataSourceTransactionManager db1TxManager(@Qualifier("db1DataSource") DataSource dataSource ){
? ? ? ?DataSourceTransactionManager txManager = new DataSourceTransactionManager();
? ? ? ?txManager.setDataSource(dataSource);
? ? ? ?return txManager;
? ?}
? ?@Bean("db2TxManager")
? ?public DataSourceTransactionManager db2TxManager(@Qualifier("db2DataSource") DataSource dataSource ){
? ? ? ?DataSourceTransactionManager txManager = new DataSourceTransactionManager();
? ? ? ?txManager.setDataSource(dataSource);
? ? ? ?return txManager;
? ?}

2.2.2注解上指定事務(wù)管理器

@Service("baseService1")
@Transactional("db1TxManager")
public class BaseService1 {
...
}

總結(jié)

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

相關(guān)文章

  • 深入理解Java8新特性之Lambda表達(dá)式的基本語法和自定義函數(shù)式接口

    深入理解Java8新特性之Lambda表達(dá)式的基本語法和自定義函數(shù)式接口

    Lambda 表達(dá)式,也可稱為閉包,它是推動(dòng) Java 8 發(fā)布的最重要新特性。Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。使用 Lambda 表達(dá)式可以使代碼變的更加簡潔緊湊
    2021-11-11
  • java的io操作(將字符串寫入到txt文件中)

    java的io操作(將字符串寫入到txt文件中)

    這篇文章主要介紹了java的io操作示例,將字符串寫入到txt文件中,需要的朋友可以參考下
    2014-04-04
  • Java Web 登錄頁面的實(shí)現(xiàn)代碼實(shí)例

    Java Web 登錄頁面的實(shí)現(xiàn)代碼實(shí)例

    這篇文章主要介紹了Java Web 登錄頁面的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java 實(shí)現(xiàn)跨平臺(tái)的操作方式

    Java 實(shí)現(xiàn)跨平臺(tái)的操作方式

    這篇文章主要介紹了Java 實(shí)現(xiàn)跨平臺(tái)的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • JAVA使用POI獲取Excel的列數(shù)與行數(shù)

    JAVA使用POI獲取Excel的列數(shù)與行數(shù)

    Apache POI 是用Java編寫的免費(fèi)開源的跨平臺(tái)的 Java API,Apache POI提供API給Java程式對(duì)Microsoft Office格式檔案讀和寫的功能。 下面這篇文章給大家介紹了JAVA使用POI獲取Excel列數(shù)和行數(shù)的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • 詳細(xì)分析JVM類加載機(jī)制

    詳細(xì)分析JVM類加載機(jī)制

    JVM將class文件字節(jié)碼文件加載到內(nèi)存中,?并將這些靜態(tài)數(shù)據(jù)轉(zhuǎn)換成方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),在堆(并不一定在堆中,HotSpot在方法區(qū)中)中生成一個(gè)代表這個(gè)類的java.lang.Class?對(duì)象,作為方法區(qū)類數(shù)據(jù)的訪問入口,接下來將詳細(xì)講解JVM類加載機(jī)制
    2022-04-04
  • SpringCloud Feign遠(yuǎn)程調(diào)用與自定義配置詳解

    SpringCloud Feign遠(yuǎn)程調(diào)用與自定義配置詳解

    Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似
    2022-11-11
  • Java 并發(fā)編程之線程掛起、恢復(fù)與終止

    Java 并發(fā)編程之線程掛起、恢復(fù)與終止

    這篇文章主要介紹了Java 并發(fā)編程之線程掛起、恢復(fù)與終止的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • BeanFactory和FactoryBean的區(qū)別示例詳解

    BeanFactory和FactoryBean的區(qū)別示例詳解

    這篇文章主要為大家介紹了BeanFactory和FactoryBean的區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • SpringBoot自定義注解開發(fā)指南

    SpringBoot自定義注解開發(fā)指南

    在開發(fā)SpringBoot程序的過程中,有可能與其他業(yè)務(wù)系統(tǒng)進(jìn)行對(duì)接開發(fā),獲取封裝公共的API接口等等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot自定義注解的相關(guān)資料,需要的朋友可以參考下
    2022-06-06

最新評(píng)論

虎林市| 鱼台县| 克拉玛依市| 方正县| 凤冈县| 娱乐| 五莲县| 区。| 阿瓦提县| 繁峙县| 平谷区| 通榆县| 张家口市| 洪洞县| 通河县| 县级市| 卓资县| 尖扎县| 哈密市| 五家渠市| 大邑县| 巨野县| 涟源市| 南宫市| 石门县| 东乌| 平山县| 老河口市| 正宁县| 海淀区| 丹寨县| 保定市| 资阳市| 财经| 芜湖市| 桃源县| 屯昌县| 新乡县| 通江县| 凤翔县| 齐河县|