不同的事务管理器如何处理@Transactional?
创始人
2025-01-08 19:01:10
0

在多个数据源的情况下,可以为每个数据源定义一个单独的事务管理器,并在需要的地方使用@Qualifier("transactionManager")标注以明确指定使用哪个事务管理器。以下是一个示例代码:

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig {

    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @ConfigurationProperties(prefix="spring.primaryDataSource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @Qualifier("secondaryDataSource")
    @ConfigurationProperties(prefix="spring.secondaryDataSource")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "primaryTransactionManager")
    @Primary
    public PlatformTransactionManager primaryTransactionManager(
      @Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

    @Bean(name = "secondaryTransactionManager")
    public PlatformTransactionManager secondaryTransactionManager(
      @Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

    @Bean(name = "primaryEntityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
      EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.example.domain.primary").persistenceUnit("primary").build();
    }

    @Bean(name = "secondaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
      EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.example.domain.secondary").persistenceUnit("secondary").build();
    }

}

这里我们定义了两个数据源(primaryDataSource和secondaryDataSource)和它们的两个事务管理器(primaryTransactionManager和secondaryTransactionManager)。对于需要在不同事务管理器下进行事务控制的方法,我们可以使用@Qualifier注释以明确指定使用哪个事务管理器。例如:

@Service
public class MyService {

    @Autowired
    private MyPrimaryRepository primaryRepository;

    @Autowired
    private MySecondaryRepository secondaryRepository;

    @Transactional("primaryTransactionManager")
    public void doSomethingInPrimary() {
        primaryRepository.save(new MyEntity());
    }

    @Transactional("secondaryTransactionManager")
    public void doSomethingInSecondary() {
        secondaryRepository.save(new MyOtherEntity());
    }

}

在这个例子中,我们用@Qualifier("primaryTransactionManager")注释标注了doSomethingInPrimary()方法,让它使用primaryTransactionManager进行事务控制。同样地,我们用@Qualifier("secondaryTransactionManager")标注了doSomethingInSecondary()方法,以使用secondaryTransactionManager进行事务控制。

通过这种方式,我们就可以在不同的数据源下使用不同的事务管理器来进行事务控制。

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...