gpt4 book ai didi

java - JdbcTemplate 选择更新

转载 作者:行者123 更新时间:2023-11-30 03:22:53 25 4
gpt4 key购买 nike

我有一个 spring 应用程序,它从数据库读取数据并将其发送到系统“X”。我使用任务执行器来启动线程,因此大约有 5 个线程同时读取数据库中的行。对于每个线程,我需要确保选择唯一的记录。为了实现这一点,我使用 JdbcTemplate 和“选择更新”

我已经编写了代码,但在日志中我可以看到 2 个线程拾取相同的行。我无法找出这个问题的根本原因。有人有建议吗

try {
List<Map<String, Object>> rows = getJdbcTemplate().queryForList(
SELECT_FOR_UPDATE,
new Object[] {a,b,c,d});


for (Map<String,Object> row : rows) {

Header a = new Header();
a.setMailID(((BigDecimal)row.get("mailID")).intValue());
a.setVersion(((BigDecimal)row.get("version")).intValue());
// some other parameters to get

getJdbcTemplate().update(UPDATE_MSG_STATE_VERSION_N_ORIG_MSG_STAT,
x,
a.getVersion()+1,
y),
a.getMailID(),
a.getVersion());

headers.add(a);
}
}

UPDATE_MSG_STATE_VERSION_N_ORIG_MSG_STAT = update MESSAGE set MSG_STAT_CD = ?, VERSION_NBR = ?, ORIG_MSG_STAT_CD=?, LAST_UPD_TS=SYSTIMESTAMP where MESSAGE.MAIL_ID = ? and VERSION_NBR = ?

String SELECT_FOR_UPDATE = "select m.MAIL_ID mailID, m.VERSION_NBR version, m.MSG_STAT_CD state,"

+ "from message m "
+ "and m.MSG_STAT_CD in ('Nerwerw')"
+ " and m.create_ts > (sysdate - ?)"
+ " and mod(mail_id,?) = ?"
+ " and ROWNUM <= ?"
+ " order by mt.MSG_PRIORITY FOR UPDATE";

最佳答案

您需要用 @Repostitory 注释您的类标签和 @Transactional标记以确保同一调用中的所有操作都在一个事务中处理。

如果它们不在同一个事务中处理,那么每个 SELECT_FOR_UPDATE 将在不同的事务上发生,因此您的线程查询将不会同步,并且您的 select_for_update 并不重要。

关于java - JdbcTemplate 选择更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30928195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com