2013-03-31 2 views
0

에서 트랜잭션을 커밋하고 트랜잭션이 삽입 실패 할 경우봄 + 최대 절전 모드 : 수동으로 나는 스프링 MVC를 사용하고 끝

모든 트랜잭션이 성공적으로 저장 나는 수동으로 트랜잭션을 커밋 어떻게
@Controller 
public class COACategoriesController { 

protected static Logger log = Logger.getLogger(COACategoriesController.class); 


@Resource(name="COACategoriesService") 
private COACategoriesService obj_coacs; 
@Resource(name="COAMaintenanceService") 
private COAMaintenanceService obj_coams; 

@RequestMapping(value = "/addCoaCategory", method = RequestMethod.POST) 
public String addCoaCategory(@RequestParam("conCatName") String coaCatName, Model model) { 

    Date sysdate = null; 
    String Message=""; 
    try{ 

    sysdate = new Date(); 


    COACategoriesModel model1 = new COACategoriesModel(coaCatName, 1, "", sysdate , 0); 

    COAMaintenanceModel account = new COAMaintenanceModel(); 
     account.setDiscription("Test Description"); 
     account.setCategoryId(model1); 

     Message="Fail-First"; 
     obj_coacs.AddCOACategories(model1); 


     Message="Fail-Second"; 
     obj_coams.AddCOAMaintenance (account); 


     Message="Add Successfully"; 
    }catch(Exception ex){ 
     log.error("Exception.."+ex); 
     model.addAttribute("success", Message); 
    } 



     return "fin/category"; 
    } 



} 

은, 모든 롤백 최대 절전 모드 catch 블록의 트랜잭션. ?

나는 스프링 MVC를 사용하고

답변

3

는 내가 거기에 필요한 모든 트랜잭션을 처리하기 위해 일부 서비스 (당신이 방법을 결합) 별도의 방법을 만드는 것을 선호 최대 절전 모드입니다.

+0

예에서 다음 코드 종류를 사용! 이것은 현재 내가 직면하고있는 문제를 해결합니다. 그러나 2 가지 방법을 결합하지 않고 어떤 방법이 있다면 제발 저에게 말할 수 있습니까? 실제로 최대 절전 모드에서 트랜잭션을 쉽게 커밋하고 롤백 할 수 있지만 스프링 MVC와 통합 한 후에는 문제가 있습니다. ? –

+1

@ShahidGhafoor "@TransactionConfiguration (defaultRollback = false)"를 사용해 보셨습니까? 나는 Alexey가 옳다고 생각하는데, 두 가지 (또는 그 이상) 방법으로 나누어야 할 수도 있습니다. 또는 Spring 종속성 삽입을 사용하여 TransactionManager를 얻거나 수동 커밋/롤백을 사용하여 고유 한 TransactionManager를 구현할 수 있습니다. 그러나, 나는 개인적으로이 대안을 정말로 좋아하지 않습니다. – Rafa

+1

@ShahidGhafoor, 내 이전 설명을 보완 : http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-programmatic – Rafa

1

먼저 트랜잭션 레벨 확약을 사용하려면 connection.autocommitfalse으로 설정해야합니다.

이 두 번째

hibernate.cfg.xml

<property name="connection.autocommit">false</property> 

를 추가하여 수행 할 수 있습니다, 당신의 DAO 수준

Session s = null; 
Transaction t = null; 
try { 
    s = getSessionFactory().openSession(); 
    t = s.beginTransaction(); 
    // code to persist the object 

} 
catch(HibernateException he) { 
    if(t != null) { 
    t.rollback(); 
    } 
} 
finally { 
    if(s != null) { 
    s.close(); 
    } 
} 
+0

예외 : 최대 절전 모드 세션 바운드 쓰레드로, 컨피규레이션은 Spring + Hibernate를 사용하기 때문에 비 트랜잭션 적으로 생성 할 수 없다. –

관련 문제