2010-07-26 4 views
2

은 왜 나에게 잠금 제한 시간을주고이된다최대 절전 모드 잠금 테이블

for(int i = 0; i < playersCount ; i++) { 
      StatUser stats = (StatUser) selectedUsers.get(i).getStatUsers().iterator().next(); 
      int gc = stats.getGamesPlayed(); 
      int gm = stats.getMakeCount(); 

      Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
      Transaction tx = session.beginTransaction(); 
      if(i == winnerIndex) { 
        stats.setGamesPlayed(gc++); 
        stats.setMakeCount(gm++); 
        session.update(stats); 
        session.flush(); 
        tx.commit(); 
        customTextBean.sendMail(selectedUsers.get(i).getEmail(), "Tillykke du har vundet"); 
      } 
      else { 
       stats.setGamesPlayed(gc++); 
       session.update(stats); 
       session.flush(); 
       tx.commit(); 
       customTextBean.sendMail(selectedUsers.get(i).getEmail(), "Tillykke " + winnersName + " skal lave kaffe"); 
      } 
     } 
+0

이상한 방법으로 나는 사용자를 찾지 못한다. :) – AnAmuser

답변

2

새로운 거래 (session.beginTransaction();)를 작성하는 경우, 새로운 DB 연결이 생성됩니다. 따라서 stats (for 루프에서)에 읽기 잠금이 있고 동일한 행에 쓰기를 시도하는 트랜잭션 -> 교착 상태가있는 트랜잭션이 있습니다.

이 문제를 해결하려면 두 번째 루프에서 모두 StatUser을 가져오고 첫 번째 트랜잭션을 닫은 다음 위의 코드에서 결과를 반복합니다. 메모리가 부족하여 그렇게 할 수 없다면 Hibernate는 더 이상 친구가 아니며 사용자 정의 SQL을 사용해야합니다.

다른 솔루션 : 낙관적 잠금을 사용하거나 사용자 지정 SQL로 변경 될 데이터를 읽고 루프의 개체를 인스턴스화하십시오.