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

时间:2016-12-06 11:41:43

标签: java spring postgresql spring-jdbc

我使用spring Jdbc进行数据库操作,使用postgres db。

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

  1. 事件新呼叫:我在数据库中插入新记录
  2. 事件调用丢失:我在DB中为同一记录更新了呼叫丢失状态。
  3. 事件调用已完成:我在数据库中更新已完成状态的相同记录。
  4. 在上面的步骤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管理员检查时 更新DB中的记录。我看到记录已正确更新 但在第3步中它没有反映出来。

    2. 用于测试目的。更新记录后我也有一些延迟 在step2但我仍然得到isLost = false

    3. 第三次事件是在第二次事件发生几毫秒之后发生的。
    4. 问题: 你能告诉我这里有什么问题吗?

      感谢。

1 个答案:

答案 0 :(得分:-1)

有时您在插入数据库时​​不会提交,因此您的select将获取旧数据,因为最后一个事务未提交。