关于事务管理

来源: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);
    }
}

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

0
0

翔仔

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);
	}

}


0
9
daygoodgoodstudy
回复
翔仔
嗯嗯好的
2019-11-24
共9条回复

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());
    }

}


0
2
daygoodgoodstudy
回复
翔仔
我加了@service注解,应该会被扫描到吧?不然怎么注入mapper执行?
2019-11-22
共2条回复

Java双版本(SSM到SpringBoot)校园商铺全栈开发

SSM商铺V1.0,解决毕设痛点;SpringBoot商铺V2.0,满足工作刚需

5113 学习 · 8144 问题

查看课程