失败回滚项目变成子模块

失败回滚项目变成子模块,第1张

在方法中,使用了hana数据源从hana数据库中查出数据,然后将数据写到mysql数据库中,对数据库进行修改 *** 作时,我们一般会添加事务回滚的 *** 作,以便程序出错时可以还原数据库。

问题:

在方法中添加能使程序异常的代码(比如:int i = 1/0)进行测试,并在方法中贴上以下注解:

@Transactional(rollbackFor = Exception.class)

复制

但是发现事务并没有回滚

检查了项目的配置, 两个数据源配置了事务管理器

hana数据源配置:

import javax.sql.DataSource

import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean

import org.apache.ibatis.session.SqlSessionFactory

import org.mybatis.spring.SqlSessionTemplate

import org.mybatis.spring.annotation.MapperScan

import org.springframework.beans.factory.annotation.Qualifier

import org.springframework.boot.jdbc.DataSourceBuilder

import org.springframework.context.annotation.Bean

import org.springframework.context.annotation.Configuration

import org.springframework.context.annotation.Primary

import org.springframework.core.io.support.PathMatchingResourcePatternResolver

import org.springframework.jdbc.datasource.DataSourceTransactionManager

import top.ibase4j.core.Constants

import top.ibase4j.core.util.PropertiesUtil

import top.ibase4j.core.util.SecurityUtil

@Configuration

@MapperScan(basePackages = "com.xxx.mapper.hana",sqlSessionTemplateRef ="hanaSqlSessionTemplate")

public class HanaDataSourceConfig {

/**创建数据源*/

@Bean(name = "hanaDataSource")

@Primary

public DataSource gethanaDataSource() {

DataSource build = DataSourceBuilder.create()

.driverClassName(PropertiesUtil.getString("hana.driverClassName"))

.url(PropertiesUtil.getString("hana.url"))

.username(PropertiesUtil.getString("hana.username"))

.password(SecurityUtil.decryptDes(PropertiesUtil.getString("hana.password"), Constants.DB_KEY.getBytes()))

.build()

return build

}

@Bean(name = "hanaSqlSessionFactory")

@Primary

public SqlSessionFactory hanaSqlSessionFactory(@Qualifier("hanaDataSource") DataSource dataSource) throws Exception {

MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean()

bean.setDataSource(dataSource)

//设置mapper配置文件

bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/hana/*.xml"))

return bean.getObject()

}

/**创建事务管理器*/

@Bean("hanaTransactionManger")

@Primary

public DataSourceTransactionManager hanaTransactionManger(@Qualifier("hanaDataSource") DataSource dataSource){

return new DataSourceTransactionManager(dataSource)

}

/**创建SqlSessionTemplate*/

@Bean(name = "hanaSqlSessionTemplate")

@Primary

public SqlSessionTemplate hanaSqlSessionTemplate(@Qualifier("hanaSqlSessionFactory") SqlSessionFactory sqlSessionFactory){

return new SqlSessionTemplate(sqlSessionFactory)

}

}

复制

mysql数据源配置:

import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean

import org.apache.ibatis.plugin.Interceptor

import org.apache.ibatis.session.SqlSessionFactory

import org.mybatis.spring.SqlSessionTemplate

import org.mybatis.spring.annotation.MapperScan

import org.springframework.beans.factory.annotation.Qualifier

import org.springframework.boot.jdbc.DataSourceBuilder

import org.springframework.context.annotation.Bean

import org.springframework.context.annotation.Configuration

import org.springframework.context.annotation.EnableAspectJAutoProxy

import org.springframework.core.io.support.PathMatchingResourcePatternResolver

import org.springframework.jdbc.datasource.DataSourceTransactionManager

import org.springframework.transaction.annotation.EnableTransactionManagement

import top.ibase4j.core.util.PropertiesUtil

import javax.annotation.Resource

import javax.sql.DataSource

@Configuration

@MapperScan(basePackages = "com.xxx.mapper.mysql",sqlSessionTemplateRef ="mysqlSqlSessionTemplate")

public class MysqlDataSourceConfig {

@Resource

private MybatisPlusConfig mybatisPlusConfig

/**创建数据源*/

@Bean(name = "mysqlDataSource")

public DataSource getmysqlDataSource() {

DataSource build = DataSourceBuilder.create()

.driverClassName(PropertiesUtil.getString("druid.default.driverClassName"))

.url(PropertiesUtil.getString("druid.writer.default.url"))

.username(PropertiesUtil.getString("druid.writer.default.username"))

.password(PropertiesUtil.getString("druid.writer.default.password"))

.build()

return build

}

@Bean(name = "mysqlSqlSessionFactory")

public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {

MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean()

bean.setDataSource(dataSource)

//设置mapper配置文件

bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/mysql/*.xml"))

Interceptor[] interceptors = {

mybatisPlusConfig.paginationInterceptor(),

mybatisPlusConfig.performanceSonInterceptor()

}

bean.setPlugins(interceptors)

return bean.getObject()

}

/**创建事务管理器*/

@Bean("mysqlTransactionManger")

public DataSourceTransactionManager mysqlTransactionManger(@Qualifier("mysqlDataSource") DataSource dataSource){

return new DataSourceTransactionManager(dataSource)

}

/**创建SqlSessionTemplate*/

@Bean(name = "mysqlSqlSessionTemplate")

public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory){

return new SqlSessionTemplate(sqlSessionFactory)

}

}

复制

由于默认的数据源是hana数据源,但是现在我们要将mysql的事务进行回滚,如果不将默认的事务管理器设置mysql对应的事务管理器为默认的话, 事务回滚将不起作用。

因此,可以添加配置类,以配置默认的事务管理器为mysql的,配置类要实现TransactionManagementConfigurer

/**

*

* 将mysql数据源的事务管理器设置为默认的事务

*/

@Configuration

public class SpecifyDefaultTransactionManagerConfig implements TransactionManagementConfigurer {

@Autowired

private MysqlDataSourceConfig mysqlDataSourceConfig

@Override

public PlatformTransactionManager annotationDrivenTransactionManager() {

return mysqlDataSourceConfig.mysqlTransactionManger(mysqlDataSourceConfig.getmysqlDataSource())

}

复制

再次进行测试,事务将回滚成功

如果不想添加配置类,可以在注解中标明使用的是哪个事务管理器

这里我们要用的是mysql的,因此可以这样配置

@Transactional(value = "mysqlTransactionManger",rollbackFor = Exception.class)

复制

value的值就是事务管理器bean的名称

spring boot

三星电视

精选推荐

广告

springboot多数据源即分布式事务解决方案

79下载·0评论

2018年10月16日

SSM多数据源配置事务回滚处理

2777阅读·0评论·1点赞

2019年1月15日

MySQL 多库事务回滚

284阅读·0评论·0点赞

2022年10月23日

Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

10下载·0评论

2021年7月21日

Spring 事务

165阅读·0评论·0点赞

2020年4月14日

java多数据源回滚_Spring多数据源事务

1053阅读·0评论·0点赞

2021年3月10日

Springboot多数据源 解决事务回滚失效

3004阅读·6评论·2点赞

2021年8月6日

springboot 多数据源 添加事务,事务回滚

1125阅读·4评论·0点赞

2021年12月1日

dynamic-datasource多数据源的配置使用(读写分离、事务的回滚)

4146阅读·3评论·4点赞

2022年1月26日

Spring Boot项目多数据源事务不生效的问题

2641阅读·0评论·8点赞

2021年10月15日

Springboot集成SpringJDBC多数据源事务回滚(二)

java使用ssm框架配置注解事务管理器报错怎么解决?

SSM现在是比较常用的框架有ssm,既是SpringMVC、Spring及MyBatis

1、确定需要集成版本,以mybatis-3.2.1、spring-framework-3.2.0.RELEASE为例

2、Spring3.2先和MyBatis3.2集成

3、创建web动态工程:注意classpath路径

4、添加Spring3.2+MyBatis3.2 mysql驱动共计30个jar文件

18个spring相关的jar文件

MyBatis3.2 版本共9个jar文件

包含mysql驱动共28个jar文件

jstl 2个jar 文件共计30个jar文件


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11666082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存