我想以同一方法在一个事务中的两个表中插入/更新记录。
首先插入到table1中,如果成功则更新table2然后如果两者都成功则只提交否则不提交(在两个表中)
我的代码如下:
ID | groupID | value
------------------------------
1 | 1 | 0.34353
2 | 1 | 0.34353
3 | 1 | 0.34353
4 | 2 | 0.23232
5 | 2 | 0.23232
6 | 3 | 1.23234
7 | 3 | 1.23234
8 | 3 | 1.23234
9 | 3 | 1.23234
然而,当我测试代码时,如果在persistTable1行之后我终止进程,它仍然会在第一个表中插入记录。 因此它不会将此视为块事务。
我正在使用mysql。
添加: table1和table2都使用单独的transactionmanager和entityManagerFactory
有人可以帮忙吗
[编辑]
使用atomikos API配置JTA的代码。
@Transactional
public void persistTable1AndTable2() {
persistTable1(List<Table1Entity>);
updateTable2(List<Table2Entity>);
}
并配置jparepo我有以下配置类:
//Atomikos related JTA configuration
@Bean(name="userTransactionServiceImp")
public UserTransactionServiceImp userTransactionServiceImp()
{
Properties properties = new Properties();
properties.setProperty("com.atomikos.icatch.max_timeout", "600000");
UserTransactionServiceImp userTransactionServiceImp = new UserTransactionServiceImp(properties);
return userTransactionServiceImp;
}
@Bean
@DependsOn("userTransactionServiceImp")
public UserTransaction userTransaction()
{
UserTransactionImp userTransactionImp = new UserTransactionImp();
return userTransactionImp;
}
@Bean
@DependsOn("userTransactionServiceImp")
public TransactionManager userTransactionManager()
{
UserTransactionManager userTransactionManager = new UserTransactionManager();
userTransactionManager.setStartupTransactionService(false);
userTransactionManager.setForceShutdown(false);
return userTransactionManager;
}
@Bean
public PlatformTransactionManager transactionManager()
{
return new JtaTransactionManager(userTransaction(), userTransactionManager());
}
答案 0 :(得分:1)
我在这里找到了一个类似的例子
看看你是否遗漏了一些配置