3

SpringHibernateTemplate과 Spring-3.0 Hibernate-3.6.5를 DAO로 사용하는 모니터링 어플리케이션을 개발했습니다. 데이터베이스 SQL Server 2008.이 응용 프로그램은 매일 장기간 트랜잭션을 실행합니다.Spring 트랜잭션에서 교착 상태가 발생했을 때 스케줄러가 멈 춥니 다.

@Repository("areaDaoHibernate") 
public class AreaDAO implements IArea { 
     protected HibernateTemplate template = null; 

     @Autowired @Required 
     public void setSessionFactory(SessionFactory sessionFactory) { 
       template = new HibernateTemplate(sessionFactory); 
     } 

     // basic dao method 
} 

이 응용 프로그램에는 springbeans를 통해 일정이 잡혀 있습니다 (실행 가능).

@Component("dailyTask") 
@Scope("prototype") 
public class DailyTask implements Runnable { 

@Override 
     public void run() { 
       // running task 
     } 
} 

이 응용 프로그램은 풀링에 Apache DBCP를 사용합니다.

이 앱이 교착 상태에 빠질 때 문제가 발생합니다. 예약을 중지하십시오.
오류 쇼 : 그래서

2012-12-27 12:57:20,861 WARN (JDBCExceptionReporter:233) - SQL Error: 1205, SQLState: 40001 
2012-12-27 12:57:20,862 ERROR (JDBCExceptionReporter:234) - Transaction (Process ID 55) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 
2012-12-27 12:57:20,866 ERROR (DailyTask:238) - org.springframework.dao.CannotAcquireLockException: could not update: [com.btpn.custody.entity.MasterData#00176ed4-b7a2-4da5-a266-ffaab3654050]; SQL [update T_CIF set __UPDATED_DATE=?, STATUS_MD=? where __SID=?]; nested exception is org.hibernate.exception.LockAcquisitionException: could not update: [com.btpn.custody.entity.MasterData#00176ed4-b7a2-4da5-a266-ffaab3654050] 
      at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:633) 
      at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793) 
      at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664) 
      at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
      at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
      at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393) 
      at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
      at $Proxy33.relateWithBranch(Unknown Source) 
      at com.btpn.custody.bean.DailyTask.relateMasterDataWithBranch(DailyTask.java:1166) 
      at com.btpn.custody.bean.DailyTask.manualInitial(DailyTask.java:213) 
      at com.btpn.custody.bean.DailyTask.run(DailyTask.java:197) 
      at java.lang.Thread.run(Unknown Source) 
Caused by: org.hibernate.exception.LockAcquisitionException: could not update: [com.btpn.custody.entity.MasterData#00176ed4-b7a2-4da5-a266-ffaab3654050] 
      at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:107) 
      at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
      at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2612) 
      at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2494) 
      at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2821) 
      at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:113) 
      at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) 
      at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) 
      at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185) 
      at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
      at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
      at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
      at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) 
      at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) 
      at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656) 
      ... 11 more 
Caused by: java.sql.SQLException: Transaction (Process ID 55) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 
      at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368) 
      at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820) 
      at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258) 
      at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632) 
      at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:584) 
      at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:546) 
      at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeUpdate(JtdsPreparedStatement.java:504) 
      at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102) 
      at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46) 
      at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2590) 
      ... 23 more 

내 질문 :

  1. 내가 교착 상태 문제를 방지하기 위해 연결 풀을 변경해야 하는가?
  2. 교착 상태가 발생한 후에 예약 빈이 실행되지 않는 이유는 무엇입니까?
+1

연결 풀 변경 : 아무 것도 변경하지 않습니다 (트랜잭션을 사용하지 않으려는 경우 제외). 교착 상태를 피하려면 응용 프로그램을 수정해야합니다. 아마도 SQL Server 로그에서 교착 상태의 일부인 행/테이블/리소스를 볼 수 있습니다. – Augusto

답변

1

SQL Server에서 교착 상태가 발생했습니다. 이것은 Spring, Hibernate, 연결 풀 또는 SQL Server 오류가 아닙니다. 문제는 응용 프로그램 또는 다른 응용 프로그램도 잠글려고하는 행을 잠그는 것입니다 (deadlock 방식).

가장 쉬운 해결 방법은 작업에 대한 재 시도 전략을 사용하는 것입니다 (실패 할 경우 전체 트랜잭션을 다시 시도하는 것). 또한 교착 상태에 관련되어있는 응용 프로그램/사용자를 SQL Server 로그를 통해 정확히 파악할 수도 있습니다.

+0

지금 코드에 집중할 수있는 설명을 해주셔서 감사합니다. –