LockAcquisitionException和SQLCODE = -911,SQLSTATE = 40001,SQLERRMC = 68

时间:2018-03-05 03:19:39

标签: java hibernate db2 timeout db2-luw

尝试从表中更新记录行时点击此按钮。

org.hibernate.exception.LockAcquisitionException: could not execute native bulk manipulation query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:105) ~[hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:198) ~[hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1190) ~[hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:357) ~[hibernate-core-3.3.1.GA.jar:3.3.1.GA]

这是我的java代码:

@Override
public void updateCurrentStatus(Long paymentHistoryId, String currentStatus) {
    StringBuilder sb = new StringBuilder( );
    sb.append( "update PaymentHistory SET " );
    sb.append( " currentStatus = :currentStatus ," );
    sb.append( " MODIFIEDDATETIME = CURRENT TIMESTAMP " );
    sb.append( "where paymentHistoryId = :paymentHistoryId " );

    final Query updateQuery = getSession( ).createSQLQuery( sb.toString( ) );
    updateQuery.setString( "currentStatus", currentStatus );
    updateQuery.setLong( "paymentHistoryId", paymentHistoryId );
    updateQuery.executeUpdate( );
}

PaymentHistory是一个实体,paymentHistoryId是主键。

因此,我相信我的方法只会更新一个PaymentHistory表的记录。

我相信原因代码68不是死锁,它的锁超时。如果有多个请求同时更新同一行记录,则会发生这种情况。

如果我可以确保没有2个请求更新此记录,还有其他任何理由来获取此异常吗?

我的db2版本是DB2 / AIX64 10.5.9

0 个答案:

没有答案