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

Posted

技术标签:

【中文标题】ibatis 插入 DB2 表会导致锁定阻止触发器工作【英文标题】:ibatis insert into a DB2 table results in a lock that prevents a trigger working 【发布时间】:2014-12-14 15:41:04 【问题描述】:

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

目前我可以写入记录,但它挂起我的应用程序并且我没有从 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 模式是否提供了该功能。

文档状态“如果参数是 OUT 或 INOUT,则参数对象属性的实际值将被更改”,但我对它所指的对象有些困惑。可以将我所有的插入值设置为 IN 是我正在寻找的吗?

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

在我的应用程序中,我采用了一种“即发即弃”的方法来处理没有通过 ExecutorService 从 DB2 数据库返回的响应,尽管我知道这不是一个理想的解决方案,但我在 3 秒后将其终止。

p>

我的程序集成了struts与spring和ibatis,调用insert的代码如下:

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

【问题讨论】:

您可能实际上并没有写入记录,而不是永久写入记录。当你写一条记录时,它会暂时锁定它,直到记录被提交——如果你不提交它(或在无提交策略下操作),杀死进程实际上会导致记录被删除! IN/OUT 参数在这里并不重要,这完全取决于您的程序正在做(或不做)的其他事情。在大多数情况下,如果您处于事务中,触发器仍应运行。我们需要查看您的程序,也许还需要查看触发器。 我已经编辑了我的原始问题以包含调用 SQL 语句的代码。触发器最有可能在 RPG 中,我将看看我可以获得哪些代码/事实。也许我有可能不对锁定负责? ...这没有多大帮助,我们需要查看您正在使用的SqlMapClientTemplate 的实现。您的 Spring 配置文件也可能是问题的一部分(即,如果他们使用期望您手动提交,但您从不这样做)。您似乎正在丢弃该语句应返回的主键。我也有点担心您将标记为'Trigger' 的东西作为参数对象传递。 【参考方案1】:

问题原来是 RPG 触发器写得不好。然而,在他们解决它之前,我确实使用 Java ServiceExecutor 管理了一个解决方法,它让我在指定的时间后重新控制了我的应用程序。

【讨论】:

以上是关于ibatis 插入 DB2 表会导致锁定阻止触发器工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 pl/sql 函数插入多个表会导致外键冲突

将古吉拉特语文本插入 MySQL 表会导致垃圾字符和不可读的文本

db2触发器after insert中怎么取得插入前的数据

求助!使用mysql触发器(其他也可)实现一条插入语句在同表中添加两条数据。

mysql 触发器阻止不合理数据插入

在 DB2 的触发器主体中引用 XML 列