2017-12-19 34 views
0

안녕하세요. 예외가 발생한 후 쿼리를 insiede 복원 절차에 문제가 있습니다. 예외 캐치가를 생성 한 후잠금 대기 시간 초과가 예외 캐치를 초과했습니다. 트랜잭션 방식

@Transactional 
public void unSetEditingFleet(Integer idFleet) throws QueryException { 
    try { 
     fleetServices.setEditingFleet(idFleet, false); 
     throw new Exception(); 
//   for(Car car : carServices.findByFleetIdFleet(idFleet)){ 
//    carServices.setEditingCar(car.getIdCar(), false); //Unset cars associated with the fleet 
//   }  
    }catch(Exception e){ 
     throw new QueryException(e); 
    } 
} 

명령 fleetServices.setEditingProgress : 이 excepton가 unSetEditingFleet 동안 occures 때 나는 새로운 예외를 던져 일어날 것을 시도하는 코드 (그것의 주요 부분)

@Override 
@Async 
@Transactional(rollbackFor=Exception.class) 
public void modifyFleet(User currentUser, FleetForm fleetForm) throws Exception { 
    //Keep the progress status on DB 
    fleetServices.setEditingProgress(fleetForm.getIdFleet(), "Start editing fleet"); 
    Fleet oldFleet = fleetServices.findById(fleetForm.getIdFleet()); 
    //some INSTRUCTIONS 
    if (!(backupFolderFile.mkdirs())) 
     throw new FileSystemException("Error making the folder backup"); 
    try{ 
     //Keep the progress status on DB 
     fleetServices.setEditingProgress(fleetForm.getIdFleet(), "Backup..."); 
     FileUtils.copyDirectory(fleetFile, new File(backupFolder)); 

     //Create fleet with new value 
     Fleet newFleet = newFleetConstructor(fleetForm, oldFleet); 
     //Change operation for all cars of the application 
     int i = 0; 
     for (Car car:oldFleet.getCars()){ 
      //some INSTRUCTIONS 

      //Keep the progress status on DB 
      fleetServices.setEditingProgress(fleetForm.getIdFleet(), "Work on car "+ car.getCarType().getIdCarType() + car.getId()+ " (" + i +" of " + oldFleet.getCars().size() +"): Editing acquisitions file" ); 

     } 

     fleetServices.setEditingProgress(oldFleet.getIdFleet(), "Updating file system fleet path"); 
     utils.unSetEditingFleet(oldFleet.getIdFleet()); 
//   throw new Exception("fleet has been restored Exception"); 
    }catch(Exception e){ 
     //Keep the progress status on DB 
     fleetServices.setEditingProgress(oldFleet.getIdFleet(), "Sorry an error occured during the procedure, wait until restore is ended!"); 
     //Restore the file system procedure 
     restoreProcedure(oldFleet.getIdFleet(), fleetFile, backupFolderFile);  
     //Keep the progress status on DB 
     fleetServices.setEditingProgress(oldFleet.getIdFleet(), ""); 
     utils.unSetEditingFleet(oldFleet.getIdFleet()); 
     //Even with this exception set the fleet as not in editing 
     throw new EditingException("fleet has been restored!"); 
    } 
} 

입니다 예외 :

Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2447) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2594) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1901) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2113) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2049) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2034) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208) 
    ... 54 more 

setEditinProgress의 코드는 다음과 같습니다

@Override 
@Transactional(propagation = Propagation.REQUIRES_NEW) //necessary to set immediately the text into the database inside a transactional method. This annotation create a new transaction 
public void setEditingProgress(Integer idFleet, String editingProgress) { 
    fleetRepository.setEditingProgress(idFleet, editingProgress); 
} 

데이터베이스에 설정되어 사용자가 진행 상황을 알 수 있도록 작업의 진행 상태를 설정합니다. catch 후에 만이 예외가 발생합니다. 어떻게 고칠 수 있니?

답변

0

다른 스레드가 너무 오랫동안 레코드 잠금을 유지하기 때문에 데이터베이스 트랜잭션이 시간 초과되었음을 알 수 있습니다. 해당 테이블에서 다른 스레드가 동시에 작업하는지 확인하십시오. 다음

SET GLOBAL innodb_lock_wait_timeout = 5000; 

:이 당신의 바쁜 DB를 사용 실행하면 here

을 같이 어떤 블록 거래를 알아낼 수있는 다른 방법은 해결 방법으로

SET innodb_lock_wait_timeout = 5000; 

일을하지만 쿼리가 필요 최적화 될 수 있습니다.