如何避免informix中的锁异常

Posted

技术标签:

【中文标题】如何避免informix中的锁异常【英文标题】:How to avoid lock exception in informix 【发布时间】:2014-10-15 13:43:17 【问题描述】:

我有一张 uuid 表,其中包含四列:id、uuid、used(true/false) 和用于乐观锁定的版本。大约有10000条记录。当我想将新人插入表人时,我首先阅读了未使用表中的 uuid。然后我更新这个已经使用的记录并插入新的人。但是当我运行性能测试时,我遇到了表 uuid 以及选择或更新记录的问题。有很多超时锁ISAM错误:

Caused by: java.sql.SQLException: ISAM error: Lock Timeout Expired
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:413) ~[ifxjdbc.jar:?]
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3982) ~[ifxjdbc.jar:?]
    at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2698) ~[ifxjdbc.jar:?]
    at com.informix.jdbcx.IfxXASqli.receiveMessage(IfxXASqli.java:116) ~[ifxjdbcx.jar:?]
    at com.informix.jdbc.IfxSqli.executeCommand(IfxSqli.java:939) ~[ifxjdbc.jar:?]
    at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java:304) ~[ifxjdbc.jar:?]
    at com.informix.jdbc.IfxStatement.c(IfxStatement.java:1283) ~[ifxjdbc.jar:?]
    at com.informix.jdbc.IfxPreparedStatement.executeUpdate(IfxPreparedStatement.java:421) ~[ifxjdbc.jar:?]
    at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.pmiExecuteUpdate(WSJdbcPreparedStatement.java:1187) ~[com.ibm.ws.runtime.jar:?]
    at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeUpdate(WSJdbcPreparedStatement.java:804) ~[com.ibm.ws.runtime.jar:?]

我怎样才能避免这个异常? webshere 中的隔离级别设置为 TRANSACTION_READ_COMMITTED 锁模式等待设置为2s,表有行锁

【问题讨论】:

什么类型的表锁定,页或行? 【参考方案1】:

2 秒的超时时间非常非常短。您使用多少并发线程进行测试?我敢打赌,在 2 秒到期之前,您几乎没有时间提交。使用 30 秒,并修改您的代码以从 uuid 表中获取下一个值并尽快提交!不要进行其他工作。我建议分配一个新的 uuid,插入新的用户行并提交。然后继续其他工作。

此外,添加用户并不会让我觉得需要对并发活动进行大量性能测试。但是,如果您要在另一个将被大量访问的表上使用此技术,您可能会遇到真正的问题。

【讨论】:

以上是关于如何避免informix中的锁异常的主要内容,如果未能解决你的问题,请参考以下文章

Informix 存储过程通用异常处理

informix中隔离级别为last committed 时的锁等待机制???

更新行时如何修复informix错误-244

PHP连接Informix异常

使用 Informix 和 Dapper 向查询添加参数失败并出现语法异常

Informix 密码即将到期异常