2012-07-09 102 views
1

例外 “org.hibernate.exception.LockAcquisitionException:无法插入” 出现有时下面的代码:休眠例外:死锁

Question questionClone; 
try { 
    questionClone = (Question) question.clone(); 
} catch (CloneNotSupportedException e) { 
    throw WrappedException.wrap(e); 
} 
questionClone.setCategory(question.getCategory()); 
questionClone.setOriginal(false); 
logger.trace("Saving questionClone " + questionClone + " start"); 
hibernateSession.save(questionClone); 
logger.trace("Saving questionClone " + questionClone + " end"); 

时questionClone保存。下面是问题的克隆方法:

public Object clone() throws CloneNotSupportedException { 
    Question questionClone = (Question) super.clone(); 

    questionClone.category = null; 

    List<Alternative> alternativesClone = new ArrayList<Alternative>(getInternalAlternatives().size()); 
    int index = 0; 
    for (Iterator<Alternative> iterator = getInternalAlternatives().iterator(); iterator.hasNext();) { 
     Alternative alternative = iterator.next(); 
     Alternative alternativeClone = (Alternative) alternative.clone(); 
     alternativeClone.setQuestion(questionClone); 
     alternativeClone.setIndex(index); 
     alternativesClone.add(alternativeClone); 
     ++index; 
    } 
    questionClone.setInternalAlternatives(alternativesClone); 

    return questionClone; 
} 

和克隆的替代方法:

public Object clone() throws CloneNotSupportedException { 
    Alternative alternativeClone = (Alternative) super.clone(); 

    alternativeClone.index = 0; 
    alternativeClone.question = null; 

    return alternativeClone; 
} 
问题

Hibernate映射包含此:

<list name="internalAlternatives" inverse="true" cascade="all-delete-orphan"> 
    <cache usage="read-write"/> 
    <key column="QUESTION_ID"/> 
    <list-index column="INDEX"/> 
    <one-to-many class="Alternative"/> 
</list> 

异常状态,它不能插入替代并导致:com.ibm.db2.jcc.am.SqlTransactionRollbackException:DB2 SQL错误:SQLCODE = -911,SQLSTATE = 40001,SQLERRMC = 2,DRIVER = 4.14.88。当我发现这是一个僵局。有人能帮忙吗?

+0

用户在开始测试时克隆了这些问题。这可能是由于几个用户同时开始测试吗?为每个用户创建单独的测试会话。 – 2012-07-09 05:52:22

回答

1
alternativeClone.setQuestion(questionClone); 

questionClone.setInternalAlternatives(alternativesClone); 

好像是dealock发生监守这些线的。您在question之内添加internalAlternatives的列表,然后在alternative之内也设置question

+0

谢谢你的答案!当我测试它时,它工作正常,没有抛出异常。然而,该应用程序已在使用中,并且出现异常。这可能是几个人同时开始测试并且一组替代品被锁定的原因吗? – 2012-07-10 08:22:14