关于事务管理
来源:5-5 代码层读写分离的实现C
daygoodgoodstudy
2019-11-21
老师,这个好像不支持事务啊,在service用那个注解都不起做用,用编程式事务管理也没有用
写回答
3回答
-
daygoodgoodstudy
提问者
2019-11-22
@Bean(name = "master") @ConfigurationProperties(prefix = "spring.datasource.hikari.master") public DataSource master() { return DataSourceBuilder.create().build(); } @Bean(name = "slave") @ConfigurationProperties(prefix = "spring.datasource.hikari.slave") public DataSource slave() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "dynamicDataSource") public DynamicDataSource dataSource(@Qualifier("master") DataSource master, @Qualifier("slave") DataSource slave) { Map<Object, Object> targetDataSource = new HashMap<>(); targetDataSource.put(DynamicDataSourceHolder.DB_MASTER, master); targetDataSource.put(DynamicDataSourceHolder.DB_SLAVE, slave); DynamicDataSource dataSource = new DynamicDataSource(); dataSource.setTargetDataSources(targetDataSource); return dataSource; }
这是配置数据源的,下面这个是你昨天给的那个
@Configuration @EnableTransactionManagement public class TransactionManageConfig implements TransactionManagementConfigurer { @Autowired @Qualifier("master") private DataSource dataSource; @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource); } }
是动态数据源的问题吗,如果像这种的话,事务要怎么才有效
00 -
翔仔
2019-11-22
问题应该是出在
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入数据库连接池 --> <property name="dataSource" ref="dataSource" /> </bean>
因为用的是springboot,可能相关用事务管理dataSource的地方配置得有问题导致不生效。
这样试试看?
package com.imooc.o2o.config.service; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.TransactionManagementConfigurer; /** * 对标spring-service里面的transactionManager * 继承TransactionManagementConfigurer是因为开启annotation-driven * * @author xiangze * */ @Configuration // 首先使用注解 @EnableTransactionManagement 开启事务支持后 // 在Service方法上添加注解 @Transactional 便可 @EnableTransactionManagement public class TransactionManagementConfiguration implements TransactionManagementConfigurer { @Autowired // 注入DataSourceConfiguration里边的dataSource,通过createDataSource()获取 private DataSource dataSource; @Override /** * 关于事务管理,需要返回PlatformTransactionManager的实现 */ public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource); } }
092019-11-24 -
daygoodgoodstudy
提问者
2019-11-21
好像还是不行,刚刚看错了,像这样他不能回滚的?不知道是不是用了springboot的原因。。。
@Transactional( rollbackFor = Exception.class) @Override public void addUser(User u) { try { userDao.insert(u); int i = 1 / 0; } catch (Exception e) { throw new RuntimeException(e.getMessage()); } }
022019-11-22
相似问题