如何避免Informix中的锁定异常

3

我有一张uuid表,包含四列:id、uuid、used(true/false)和用于乐观锁定的版本。大约有10000条记录。当我想要将新人插入到person表中时,我首先从表中读取未使用的uuid。然后更新已经使用的记录并插入新的person。但是当我运行性能测试时,我遇到了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:?]

我该如何避免这个异常?WebSphere中的隔离级别设置为TRANSACTION_READ_COMMITTED,锁模式等待时间设置为2秒,表格具有行锁定。


表锁定的类型是页面锁定还是行锁定? - rjhdby
1个回答

1
2秒的超时时间非常短。你在测试中使用了多少并发线程?我敢打赌,在2秒到期之前,你几乎没有时间提交。请使用30秒,并修改代码尽可能快地从uuid表获取下一个值并提交!不要执行其他工作。我建议分配一个新的uuid,插入新的用户行并提交。然后再进行其他工作。
此外,添加用户似乎不需要针对并发活动进行重度性能测试。但是,如果您将在另一个将被大量访问的表上使用此技术,您可能会遇到真正的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接