【问题标题】:Select Not returning results when an Update statement is running on the same row?选择在同一行上运行更新语句时不返回结果?
【发布时间】:2019-03-21 06:10:58
【问题描述】:

我有一个表格,其中有列

Task_Track

  • TaskID 编号(PK AutoGeneratedSequence)
  • TaskCd Varchar2
  • RefCd Varchar2
  • RefID varchar2
  • 参数 varchar2
  • ...等

我正在处理一个场景,我在此表上运行选择查询以获取结果集。

Select * from Task_Track where RefCd = ?和 RefID = ?和 TaskCd = ?;

如果我没有任何结果,我将插入一个带有 RefCd RefID TaskCd 参数值的新任务。参数通常是与任务相关的 person_id。 如果我得到结果集,我将附加新参数并更新结果集。

if(resultset!=null and resultSet.length()>0)

更新参数逻辑

其他

插入新的任务逻辑。

这在连续运行中按预期工作。 但是当我运行 2 个并行队列并同时获得相同的 RefCd RefID TaskCd 值时。 我的第一个存储桶正在查找结果集并将按预期执行更新逻辑,但第二个队列无法找到结果并进入插入逻辑。

据我了解,即使第一个队列已锁定更新行,如果第一个队列尚未释放锁,则第二个队列不应有任何读取问题,并且由于锁而更新时应该失败.但是我的读取本身失败了,它没有抛出任何异常,而是返回一个空的结果集(长度 = 0)。因此,它正在进入插入逻辑。

读取是否可能受到并行更新的影响?如果是,我应该如何解决?

注意:我在 Websphere 9 中使用 Oracle 11G 和 Java8

谢谢

【问题讨论】:

    标签: java sql oracle11g


    【解决方案1】:

    您需要在发出另一个请求之前缓存结果集。试试这个:

    CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet();
    crs.populate(myResultSet);
    

    【讨论】:

    • 您好,感谢您的建议。但是正在处理的数据量太多了......现在在测试场景中,我正在使用 4000 Trigger Dump 让两个并行队列进行处理,但实时触发器的数量可能超过 5-是当前转储的 10 倍,我不确定 chaching 这么多结果集并不理想。
    • 嗨@SitaramVuppala,你能获得不同的连接来执行第二个查询吗?
    • 嗨,两个并行队列有自己的数据库连接...现在我没有控制两个队列的连接相同
    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2017-12-19
    • 2021-05-06
    • 2013-11-17
    • 2019-09-07
    • 2020-12-31
    • 2015-07-02
    相关资源
    最近更新 更多