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?