以相同的方法在一个事务块中的两个表中插入记录

时间:2017-04-19 09:13:28

标签: mysql transactions spring-transactions

我想以同一方法在一个事务中的两个表中插入/更新记录。

首先插入到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());
} 

1 个答案:

答案 0 :(得分:1)

我在这里找到了一个类似的例子

快速检查http://fabiomaffioletti.me/blog/2014/04/15/distributed-transactions-multiple-databases-spring-boot-spring-data-jpa-atomikos/

看看你是否遗漏了一些配置