Atomikos not commit when using @Transactional

Viewed 14

I want to control transaction between 3 database using atomikos. When adding @Transactional anotation, the transaction does not commit in 1 database but it also work without this anotation. This is my configuration:
Atomikos config

@Configuration
@EnableTransactionManagement
public class AtomikosConfiguration {

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        hibernateJpaVendorAdapter.setShowSql(false);
        hibernateJpaVendorAdapter.setGenerateDdl(false);
        hibernateJpaVendorAdapter.setDatabase(Database.MYSQL);
        return hibernateJpaVendorAdapter;
    }

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

    @Bean(name = "atomikosTransactionManager")
    public TransactionManager atomikosTransactionManager() throws Throwable {
        UserTransactionManager userTransactionManager = new UserTransactionManager();
        userTransactionManager.setForceShutdown(false);
        AtomikosJtaPlatform.transactionManager = userTransactionManager;
        return userTransactionManager;
    }

    @Primary
    @Bean(name = "insertTransactionManager")
    @DependsOn({ "userTransaction", "atomikosTransactionManager" })
    public PlatformTransactionManager transactionManager() throws Throwable {
        UserTransaction userTransaction = userTransaction();
        AtomikosJtaPlatform.transaction = userTransaction;
        TransactionManager atomikosTransactionManager = atomikosTransactionManager();
        JtaTransactionManager transactionManager =  new JtaTransactionManager(userTransaction, atomikosTransactionManager);
        transactionManager.setAllowCustomIsolationLevels(true);
        return transactionManager;
    }

}
@Configuration
@EnableJpaRepositories(
        entityManagerFactoryRef = "trkInsertEntityManagerFactory",
        transactionManagerRef = "insertTransactionManager",
        basePackages = {"common.repository.trk"}
)
@DependsOn("insertTransactionManager")
@EnableTransactionManagement
public class TrkDataSourceConfig {
    private String MODEL_PACKAGE = "common.model.trk";

    @Autowired
    private JpaVendorAdapter jpaVendorAdapter;


    @Bean(name = "trkInsertEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean trkEntityManagerFactory(@Qualifier("trkDataSource") DataSource dataSource) {
        HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.transaction.jta.platform", AtomikosJtaPlatform.class.getName());
        properties.put("javax.persistence.transactionType", "JTA");
        LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();
        entityManager.setPackagesToScan(MODEL_PACKAGE);
        entityManager.setJpaPropertyMap(properties);
        entityManager.setJpaVendorAdapter(jpaVendorAdapter);
        entityManager.setJtaDataSource(dataSource);
        entityManager.setPersistenceUnitName("trkInsertPersistenceUnit");
        return entityManager;
    }
}
@Configuration
@EnableJpaRepositories(
        entityManagerFactoryRef = "multipleEntityManagerFactory",
        transactionManagerRef = "insertTransactionManager",
        basePackages = {"common.repository.entity"}
)
@EnableTransactionManagement
@Import(RoutingDataSource.class)
@DependsOn("insertTransactionManager")
public class JpaEntityManager {

    @Resource(name = "dynamicDataSource")
    private DataSource dataSource;
    @Autowired
    private JpaVendorAdapter jpaVendorAdapter;
    private String MODEL_PACKAGE = "common.model.entity";

    @Bean(name = "multipleEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean multipleEntityManagerFactory() {
        HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.transaction.jta.platform", AtomikosJtaPlatform.class.getName());
        properties.put("javax.persistence.transactionType", "JTA");
        LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();
        entityManager.setPackagesToScan(MODEL_PACKAGE);
        entityManager.setJpaPropertyMap(properties);
        entityManager.setJpaVendorAdapter(jpaVendorAdapter);
        entityManager.setJtaDataSource(dataSource);
        entityManager.setPersistenceUnitName("multiplePersistenceUnit");
        return entityManager;
    }

}

My transaction

 @Transactional(value = "insertTransactionManager")
    public void write(List<? extends BagTrk> items) throws Exception {
        BagModelEntity bagModel = loadModel(items);
        try {
            insertModels(bagModel);
        }catch(Exception e) {
            Integer[] orders = bagModel.getMapOrders().keySet().toArray(new Integer[0]);
            System.out.println(">>> Update Bag_trk error at batch: "+ StringUtils.join(orders, ", "));
            throw e;
        }

        try {
            updateTrackingStatus(items);
        }catch(Exception e) {
            Integer[] orders = bagModel.getMapOrders().keySet().toArray(new Integer[0]);
            System.out.println(">>> Update Bag_trk error at batch: "+ StringUtils.join(orders, ", "));
            throw e;
        }
        System.out.println(">>> writing completed. Size=" + items.size());

    }

When debugging, i see that insertModel not call insert SQL. Can anyone help me, plz?

0 Answers
Related