问题:
在方法中添加能使程序异常的代码(比如: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多数据源事务回滚(二)
hana数据库与数据仓库区别分别是:
数据库(Database)是:
1、相对复杂的表格结构,存储结构相对紧致,少冗余数据。
2、读和写都有优化。
3、相对简单的read/write query,单次作用于相对的少量数据。
数据仓库(Datawarehouse)是:
1、相对简单的(Denormalized)表格结构,存储结构相对松散,多冗余数据。
2、一般只是读优化。
3、相对复杂的read query,单次作用于相对大量的数据(历史数据)。
并且数据库 Database (Oracle, Mysql, PostgreSQL)主要用于事务处理,数据仓库 Datawarehouse (Amazon Redshift, Hive)主要用于数据分析。
数据仓库的弱势之处是:
并不是所有的读 *** 作,数据仓库一直都有优势。比如在如下两种情况时,数据仓库的读表现并不如数据库:
1、在对小量数据进行读取 *** 作的时候,由于数据仓库要进行找Node的location之类的预运算,整体效率上反倒不如数据库。
2、如果读取 *** 作的目标不是主键(PrimaryKey)或者分配键(PartitionKey),那么数据仓库的查询也需要进行全局扫描,效率上就不好说是否胜过数据库了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)