s578540525 2017-07-20 12:13 采纳率: 0%
浏览 5690
已结题

springboot+jpa+jta-atomikos多数据源事务异常

springboot + jpa配置jta事务,出现第一个数据源可以正常使用,但第二个只能查询,不能CRUD操作,求大神指点

第一个数据源如下:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.saxon.primary.dao",
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "jtaTransactionManager")
public class PrimaryDataSourceConfig {

@Bean
@Primary
@ConfigurationProperties("spring.primary.datasource")
public DataSourceProperties primaryProperties(){
    return new DataSourceProperties();
}

@Bean
@Primary
@ConfigurationProperties("spring.primary.datasource")
public DataSource primaryDataSource(){
    return primaryProperties().initializeDataSourceBuilder().build();
}

@Bean
@Primary
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder){
    return builder
            .dataSource(primaryDataSource())
            .persistenceUnit("primary")
            .packages("com.saxon.primary.entity")
            .build();
}

}

第二个数据源:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.saxon.others.dao",
entityManagerFactoryRef = "othersEntityManagerFactory",
transactionManagerRef = "jtaTransactionManager")
public class OthersDataSourceConfig {

@Bean
@ConfigurationProperties("spring.others.datasource")
public DataSourceProperties othersProperties(){
    return new DataSourceProperties();
}

@Bean
@ConfigurationProperties("spring.others.datasource")
public DataSource othersDataSource(){
    return othersProperties().initializeDataSourceBuilder().build();
}

@Bean
public LocalContainerEntityManagerFactoryBean othersEntityManagerFactory(EntityManagerFactoryBuilder builder){
    return builder
            .dataSource(othersDataSource())
            .persistenceUnit("others")
            .packages("com.saxon.others.entity")
            .build();
}

}

jta事务配置:
@Configuration
@EnableTransactionManagement
public class TransactionManagerConfig {

@Bean(destroyMethod = "close", initMethod = "init")
public UserTransactionManager userTransactionManager() {
    UserTransactionManager userTransactionManager = new UserTransactionManager();
    userTransactionManager.setForceShutdown(false);
    return userTransactionManager;
}

public @Bean UserTransaction userTransaction() throws Throwable {
    UserTransactionImp userTransactionImp = new UserTransactionImp();
    userTransactionImp.setTransactionTimeout(300);
    return userTransactionImp;
}

public @Bean PlatformTransactionManager jtaTransactionManager() throws Throwable  {
    JtaTransactionManager jtaTransactionManager = new JtaTransactionManager();
    jtaTransactionManager.setTransactionManager(userTransactionManager());
    jtaTransactionManager.setUserTransaction(userTransaction());
    return jtaTransactionManager;
}

}
但执行第二个数据源的crud操作,报如下异常:
2017-07-20 18:00:43.131 ERROR 46084 --- [nio-9008-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: no transaction is in progress; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress] with root cause

javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1136) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1297) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347) ~[spring-orm-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at com.sun.proxy.$Proxy76.flush(Unknown Source) ~[na:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]

  • 写回答

1条回答 默认 最新

  • devmiao 2017-07-20 13:43
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R