spring jdbc更新方法未提交更新,因为get Record返回旧值

问题描述 投票:0回答:1

我正在使用spring Jdbc进行postgres db的数据库操作。

我收到正在处理的连续通知。

  1. 事件新呼叫:我将新记录插入数据库中
  2. 事件呼叫丢失:我为同一条记录更新了数据库中的呼叫丢失状态。
  3. 事件调用已完成:我为同一条记录更新了数据库中的已完成状态。

在上面的第3步中,我从DB那里获得了我希望调用Lost为真的记录,但没有获得我在第2步中所做的更新值。

注意:事件由推送事件的单个线程发送。因此所有事件都是按顺序发生的。

public void processEvent(EventData event){
    if(event.new){
      dao.add(entity)
    }else if(event.ISLOST){
       entity = dao.getEventById(event.id);
       entity.setLost(true);  // setting isLost to true
       dao.update(entity);
    }else if(event.COMPLETED){
         entity = dao.getEventById(event.id);
         logger.info("is Lost:"+ event.isLost()) // it returns false. Viz its set to true in stp2
         dao.update(entity); //error as isLost is overwritten here.
    }

}

DAO代码:

@Override
public long registerEvent(final Event callEvent) {
    KeyHolder keyHolder = new GeneratedKeyHolder();
    int row = getJdbcTemplate().update(new PreparedStatementCreator() {
        @Override
        public PreparedStatement createPreparedStatement(Connection connection)
                throws SQLException {
            PreparedStatement ps = connection.prepareStatement(QueryDefinitions.REGISTER_EVENT_QUERY,Statement.RETURN_GENERATED_KEYS);
            ps.setLong(1,callEvent.getCategoryID());
            ps.setBoolean(2,callEvent.isLost() );
            ps.setBoolean(3,callEvent.isCompleted() );
            return ps;
        }
    },keyHolder);
    long generatedRowId = (long)keyHolder.getKeys().get("callregisterid");
    return generatedRowId;
}

其他意见:

  1. 当我在dao之后的调试过程中从Postgres管理员检查时更新数据库中的记录。我看到记录已正确更新但在第3步中,它没有反映出来。

  2. 用于测试目的。更新记录后,我还拖了一些时间在step2中,但我仍然得到isLost = false

  3. 第三事件发生在第二事件发生几毫秒后。

问题:您能建议这里有什么问题吗?

java spring postgresql spring-jdbc
1个回答
-1
投票

有时,当您插入数据库时​​,您不会提交,因此您的选择将获得旧数据,因为上一次事务未提交。

© www.soinside.com 2019 - 2024. All rights reserved.