【问题标题】:Not able to update multiple rows, table being locked无法更新多行,表被锁定
【发布时间】:2017-10-16 05:42:27
【问题描述】:

我正在尝试更新多个具有“已关闭”状态的记录,只要该列的值很少。

但是,它返回了我

Error code :-913, Error message :[SQL0913] Row or object BBT_00008 in BB type *FILE in use.

这是我的代码

    public void updateIdsStatus(boolean allIdCreated, List<String> ids) throws ClassNotFoundException, SQLException, BBException {
    if(ids.size() > 0) {
        Connection con = null;
        PreparedStatement ps = null;
        con = DBUtil.getConnection();   
        try {               
            String sql;

            if (allIdCreated) {
                logger.info("Updating the status of the ids as CLOSED");
                sql = "UPDATE <table> SET STATUS = 'CLOSED' WHERE BBDIDNOPK IN ('"+StringUtils.join(ids, "', '")  +"') ";
            } else {
                logger.info("Updating the status of the deals as NEW");
                sql = "UPDATE <table> SET STATUS = 'NEW' WHERE BBDIDNOPK IN ('"+StringUtils.join(ids, "', '")  +"') ";
            } 
            logger.info("updateIdsStatussql :"+sql);
            ps = con.prepareStatement(sql);
            ps.executeUpdate();
        } catch (SQLException e) {
            logger.info(e.getErrorCode()+"-"+e.getMessage());   
            throw new BBException (e.getErrorCode(), e.getMessage());
         } catch (Exception e) {
            logger.info(e);
        } finally {
            try{    
                if(ps != null) 
                    ps.close();
                if (con != null)
                    con.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
    }
}

它打印的查询是

UPDATE <table name> SET STATUS = 'CLOSED' WHERE BBDIDNOPK IN ('abc34569sf', 'abc38511hu') 

为什么表被锁定?

P.S:除了我之外没有其他人在运行代码,也没有人在访问数据库(DB2)。

【问题讨论】:

  • 除了你之外没有人在运行代码,但是其他人会使用数据库吗?如果是这种情况,请告诉我们。
  • @TimBiegeleisen,已更新。没有人在使用数据库,也没有其他开发人员或测试人员。只有我使用代码和数据库
  • @a_horse_with_no_name,我正在使用 DB2 并在问题中进行了更新。
  • 如果 Db2 服务器在 i 系列 (as/400) 上运行,请遵循文档页面 ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/rzala/… 上的 SQL0913 恢复文本,特别是从 Db2 确定哪些锁处于活动状态。您可能认为您是唯一针对该表运行的语句,因此最好验证您的假设。
  • 旁注:直接连接是 SQL 注入的向量。你应该做的是创建一个参数标记的动态列表并替换它们(如果没有别的,为了良好的做法)。

标签: sql jdbc db2


【解决方案1】:

List&lt;String&gt; ids 来自哪里?

假设代码的另一部分中的 SQL 语句访问相同的行,那么它很可能是您的锁的来源。

还包括该代码...

没有它,一些建议

  • 传入连接,使锁在同一个连接内
  • 先关闭之前的 RS/连接
  • 更新第一条语句中的行

【讨论】:

    猜你喜欢
    • 2017-10-06
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多