请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于事务管理

老师,这个好像不支持事务啊,在service用那个注解都不起做用,用编程式事务管理也没有用

正在回答 回答被采纳积分+3

3回答

提问者 daygoodgoodstudy 2019-11-22 21:55:24
@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);
    }
}

是动态数据源的问题吗,如果像这种的话,事务要怎么才有效

0 回复 有任何疑惑可以回复我~
翔仔 2019-11-22 00:49:12

问题应该是出在

   <!-- 配置事务管理器 -->
    <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);
	}

}


0 回复 有任何疑惑可以回复我~
  • 提问者 daygoodgoodstudy #1
    好的谢谢老师,辛苦了,我明天试一下,早点休息别熬夜啦
    回复 有任何疑惑可以回复我~ 2019-11-22 00:52:31
  • 翔仔 回复 提问者 daygoodgoodstudy #2
    哈哈 没办法呀 十一点下班回来 还要抓紧时间准备spring源码课程,火烧眉毛:)
    回复 有任何疑惑可以回复我~ 2019-11-22 00:54:27
  • 提问者 daygoodgoodstudy 回复 翔仔 #3
    哇,又有新课看,买买买٩(˃̶͈̀௰˂̶͈́)و
    回复 有任何疑惑可以回复我~ 2019-11-22 00:56:10
提问者 daygoodgoodstudy 2019-11-21 22:07:11

好像还是不行,刚刚看错了,像这样他不能回滚的?不知道是不是用了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());
    }

}


0 回复 有任何疑惑可以回复我~
  • 翔仔 #1
    同学好,感觉是因为你的事务配置有问题?就是没有扫描相关的包并用事务管理起来,尽管声明了事务,但是如果没被容器扫描到并且管理起来是没有作用的呢
    回复 有任何疑惑可以回复我~ 2019-11-22 00:38:44
  • 提问者 daygoodgoodstudy 回复 翔仔 #2
    我加了@service注解,应该会被扫描到吧?不然怎么注入mapper执行?
    回复 有任何疑惑可以回复我~ 2019-11-22 00:41:39
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信