当前位置: 首页 > 知识库问答 >
问题:

ibatis插入DB2表会导致锁,从而阻止触发器工作

祝宏放
2023-03-14

我正在将一个INSERT写入一个DB2表,该表使用我插入的记录作为触发器,并被指控是锁定文件和阻止触发器工作的罪魁祸首。

目前,我可以编写记录,但它会挂起我的应用程序,并且我没有从DB2数据库得到任何响应。(尽管它确实写了!)。

我被告知我可能正在使用“更新模式”写作,但除了没有实际设置任何模式之外,我没有做任何具体的事情:

  <resultMap id = "insertEntry" class = "customer">
        <result property = "supplierNumber"     column = "SUPN"/>
        <result property = "status"          column = "STAT"/>
        <result property = "timeAccepted"   column = "TIMEACC"/>
        <result property = "dateAccepted"   column = "DATEACC"/>
        <result property = "dateCompleted"   column = "DATECOMP"/>
    </resultMap>


<insert id = "insertCUSTRecord" parameterClass="insertEntry">
INSERT INTO ##AKQQ3
(SUPN, STAT, TIMEACC, DATEACC, DATECOMP)
VALUES (#supplierNumber#, #status#, #timeAccepted#, #dateAccepted#, #dateCompleted#)
</insert>

我只能猜测我的应用程序挂起的原因,其中一个猜测是没有在INSERT语句上设置相关模式,但我不知道从ibatis的IN、OUT和INOUT参数中选择哪个是相关的。

RPG团队告诉我,尝试以某种方式尝试读取我刚刚插入的记录以释放此锁,并想知道这些ibatis模式是否提供了该功能。

docs声明“如果一个参数是OUT或INOUT,参数对象属性的实际值将被更改”,但我有点搞不清楚这指的是什么对象。是否可以将所有插入值设置为IN?

我应该提到的是,我使用Squirrel SQL客户机尝试了相同的插入(使用jt400 JDBC驱动程序),它挂起并且没有从数据库得到确认,尽管已经写入了记录。

在我的应用程序中,我采用了一种“触发并忘记”的方法,即不通过ExecutorService从DB2数据库返回响应,我会在3秒钟后终止该服务,尽管我知道这不是一个理想的解决方案

我的程序集成了Spring和ibatis的支柱,调用插入的代码如下:

public void insertIntoAKQA(CustomerTriggerDetailsBean customerTriggerDetails) {
    SqlMapClientTemplate template = getSqlMapClientTemplate();
    template.insert("insertCUSTRecord", customerTriggerDetails);
}

共有1个答案

壤驷文华
2023-03-14

这个问题原来是RPG触发器写得很糟糕。在他们解决之前,我确实使用了JavaServiceExecator--它在指定的时间后让我重新控制了我的应用程序。

 类似资料:
  • 在“name=new.user_name”后面发现意外的标记“end-of-statement”。预期的令牌可能包括:“”..sqlcode=-104,sqlstate=42601,driver=4.9.78 SQL code:-104,SQL state:42601

  • 我写了这个触发器,但它不工作,我执行了这个错误: 11:24:11创建触发器check_venduti在INSERT ON venduti之后,对每一行开始SELECT count(*)作为num_rows FROM prodotto(其中COD_PRODOTTO=New.COD_PRODOTO如果numrows<0,则发出“Error”信号,结束错误代码:1064)。您的SQL语法有错误;检查与

  • 我发现了一个SQL死锁问题,当函数由两个用户并发执行时会发生该问题。我有一个PHP函数,它执行几个包含在事务中的数据库插入查询。其中一个插件也触发了一个触发器。请参阅下面的我的表模式和代码示例。 主表 历史表格 审计表 我在main_table上有一个触发器,定义如下。它所做的是从audit_table中选择最大id并将记录插入到history_table。 下面是由两个用户同时执行的函数。插入记

  • 也许有人能帮我澄清一下。 我正在尝试编写一个插入前触发器,如果它留空,可以设置关闭。这可能吗? 没有太多代码可显示。我所做的只是创建了一个带有调试语句的简单的插入前触发器,以确保我的触发器在验证规则之前执行。似乎验证规则是第一位的(我显然无法更改它)。触发器永远不会触发。 这是可行的还是不可能的?

  • 在我的OS/400V6中。x系统我使用ADDPFTRG命令为物理文件(DB2表)创建了一个插入后触发器,每当我在RPG IV程序上执行写命令或从STRSQL生成INSERT语句时,该命令都会正确触发,但当我使用JT400(JTOpen)JDBC驱动程序从Java程序执行INSERT语句时,触发器不会触发。 在这两种情况下(从OS400和从Java),都会成功插入记录,但只有从OS400插入记录时才

  • 问题内容: 由于MySQL忽略了检查约束,如何使用触发器来阻止插入或更新的发生? 例如: 表foo有一个称为agency的属性,并且agency属性只能是1、2、3、4或5。 还是有更好的方法来进行MySQL中的检查约束? 问题答案: 尝试SIGNAL语法-https: //dev.mysql.com/doc/refman/5.5/en/signal.html 编辑 根据Bill Karwin下面