【发布时间】:2023-03-14 17:42:01
【问题描述】:
我设法将 spring + atomikos 配置为跨多个数据库进行全局事务,例如,以事务方式更新或插入记录。我一直在使用 @Transactional 注释和 SqlUpdate 或 BatchSqlUpdate 类来执行数据库事务。这是一个代码示例:
@Transactional
public void insertBatchIntoT1(List<Integer> ids, List<String> names) {
Map<String, Object> params = new HashMap<>();
for (int i = 0; i < ids.size(); i++) {
int id = ids.get(i);
String name = names.get(i);
params.put("id", id);
params.put("name", name);
for (BatchSqlUpdate u : insertIntoT1)
u.updateByNamedParam(params);
}
for (BatchSqlUpdate u : insertIntoT1)
u.flush();
}
该方法采用 id 和名称列表(也可以是自定义 POJO 列表),并且对于列表中的每个项目,它设置为每个 DataSource 对象定义的每个批量更新中的参数(使用定义的准备好的语句在初始化时)并对每个执行更新。然后为每个 DataSource 刷新 BatchSqlUpdate。 我想知道这是否可以以不同的方式完成:是否可以在不触发提交的情况下将记录增量添加到 BatchSqlUpdate?例如,我希望能够定义三个方法:startBatchUpdate()、addToBatch(int id,String name) 和 flushBatch(),并且在第一个和第三个方法调用之间有一个事务。我尝试使用 Propagation.REQUIRED 属性,但它似乎没有解决问题。有任何想法吗? 我希望我的问题很清楚! 谢谢
【问题讨论】:
-
嗯。看起来你想要的是 XA 协议,也就是 2 阶段提交:en.wikipedia.org/wiki/Two-phase_commit_protocolatomikos.com/Documentation/WhatIsXa
-
不,这是我已经在使用的(根据 Transactional 注释)。我只是想知道是否可以避免传递列表的需要。到目前为止,我发现的唯一解决方案是将记录存储在缓冲区中,然后在批处理完成时调用一个事务方法,该方法从缓冲区获取数据并提交更新/插入。
标签: spring batch-processing jta atomikos