SpringBoot手動開啟事務(wù):DataSourceTransactionManager問題
DataSourceTransactionManager
添加事務(wù):
- 傳統(tǒng)JDBC事務(wù)管理,使用DataSource從數(shù)據(jù)源中獲取connection
- 通過api進行CRUD,之后手動commit、rollback。
- 應(yīng)用spring提供的編程式的事務(wù)管理
- 使用spring的聲明式事務(wù)處理
Spring的事務(wù)處理中,通用的事務(wù)處理流程是由抽象事務(wù)管理器AbstractPlatformTransactionManager來提供的,而具體的底層事務(wù)處理實現(xiàn),由PlatformTransactionManager的具體實現(xiàn)類來實現(xiàn),如 DataSourceTransactionManager 、JtaTransactionManager和 HibernateTransactionManager等。
SpringBoot中手動開啟事務(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的自動代理
<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"> ? ? <!--對數(shù)據(jù)源進行代理,使數(shù)據(jù)源具有感知事務(wù)上下文的能力,當(dāng)某些場景下顯示獲取數(shù)據(jù)庫連接時,保證獲取到的連接是綁定了當(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的自動代理--> ? ? <aop:config> ? ? ? ? <!--切點 匹配com.fxy子包下的所有方法--> ? ? ? ? <aop:pointcut id="serviceMethod" ? ? ? ? ? ? ? ? ? ? ? expression="execution(* com.fxy..*.*.service..*.*(..))"/> ? ? ? ? <!--切面--> ? ? ? ? <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/> ? ? </aop:config> ? ? <!--增強 新增變更刪除方法 遇到檢查型異常和非檢查型異常均回滾--> ? ? <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標簽,可以追蹤到TransactionInterceptor類,其實現(xiàn)了MethodInterceptor接口,會在目標方法前后實施增強(即使用txManager,在方法執(zhí)行前關(guān)閉Connection對象自動提交,方法執(zhí)行完成后執(zhí)行Connection對象提交方法,異常時執(zhí)行Connection對象回滾方法)。
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"> ? ? <!--對數(shù)據(jù)源進行代理,使數(shù)據(jù)源具有感知事務(wù)上下文的能力,當(dāng)某些場景下顯示獲取數(shù)據(jù)庫連接時,保證獲取到的連接是綁定了當(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"/> ? ? <!--對使用transactional注解的bean進行加工,織入事務(wù)管理切面 --> ? ? <tx:annotation-driven transaction-manager="txManager"/> </beans>
2.SpringBoot框架配置事務(wù)
2.1@Transactional注解
2.1.1SpringBoot自動裝配事務(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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐
這篇文章主要介紹了springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07教你如何把Eclipse創(chuàng)建的Web項目(非Maven)導(dǎo)入Idea
這篇文章主要介紹了教你如何把Eclipse創(chuàng)建的Web項目(非Maven)導(dǎo)入Idea,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04SpringMVC數(shù)據(jù)輸出相關(guān)知識總結(jié)
今天帶大家學(xué)習(xí)SpringMVC的相關(guān)知識,文中對SpringMVC數(shù)據(jù)輸出作了非常詳細的代碼示例,對正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06Java拷貝數(shù)組方法Arrays.copyOf()是地址傳遞的證明實例
今天小編就為大家分享一篇關(guān)于Java拷貝數(shù)組方法Arrays.copyOf()是地址傳遞的證明實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10Java解除文件占用即Dom4j操作后實現(xiàn)xml關(guān)流
這篇文章主要介紹了Java解除文件占用即Dom4j操作后實現(xiàn)xml關(guān)流,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04Classloader隔離技術(shù)在業(yè)務(wù)監(jiān)控中的應(yīng)用詳解
這篇文章主要為大家介紹了Classloader隔離技術(shù)在業(yè)務(wù)監(jiān)控中的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08