采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,这个好像不支持事务啊,在service用那个注解都不起做用,用编程式事务管理也没有用
@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); } }
是动态数据源的问题吗,如果像这种的话,事务要怎么才有效
问题应该是出在
<!-- 配置事务管理器 --> <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); } }
好的谢谢老师,辛苦了,我明天试一下,早点休息别熬夜啦
哈哈 没办法呀 十一点下班回来 还要抓紧时间准备spring源码课程,火烧眉毛:)
哇,又有新课看,买买买٩(˃̶͈̀௰˂̶͈́)و
好像还是不行,刚刚看错了,像这样他不能回滚的?不知道是不是用了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()); } }
同学好,感觉是因为你的事务配置有问题?就是没有扫描相关的包并用事务管理起来,尽管声明了事务,但是如果没被容器扫描到并且管理起来是没有作用的呢
我加了@service注解,应该会被扫描到吧?不然怎么注入mapper执行?
登录后可查看更多问答,登录/注册
SSM商铺V1.0,解决毕设痛点;SpringBoot商铺V2.0,满足工作刚需
1.9k 47
1.8k 41
2.5k 40
1.8k 39
1.5k 37