如何避免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中隔离级别为last committed 时的锁等待机制???