2016-04-21 44 views
1

我正在學習Spring,並且在Spring中我遇到了一些與事務有關的問題。在Spring中發生異常時的事務回滾

這裏是我的代碼

@Transactional(rollbackFor = Exception.class) 
public void createGroupStudent(Student A,Student B,String nameGroup){ 
    try{ 
     //create Group 
     createGroup(nameGroup); 
     //createMember 
     createMember(A,B); 
    }catch(Exception e){ 
     logger.error(e.getMessage()); 
    } 
} 

@Transactional(rollbackFor = Exception.class) 
public void createGroup(String nameGroup){ 
    try{ 
     repoGroup.save(nameGroup); 
    }catch(Exception e){ 
     logger.error(e.getMessage()); 
    } 
} 

@Transactional(rollbackFor = Exception.class) 
public void createMember(Student A,Student B){ 
    try{ 
     // function will throw a kind of Exception involve to " error constraint sql oracle " . 
     //It's my intended 
     repoMember.save(A,B); 
    }catch(Exception e){ 
     logger.error(e.getMessage()); 
    } 
} 

問題是,當功能createMember()拋出異常,事務回滾送花兒給人爲什麼?我無法理解發生了什麼!我添加了嘗試,抓住每種方法,但它沒有奏效。

雖然方法createMember()保存到數據庫(這裏我使用函數saveAndFlush())有麻煩。我知道它,我發現了這個異常。父母交易createGroupStudent()認爲自己沒有問題並提交交易。但是當再次提交方法createMember()會中斷並拋出Exception.I認爲方法createGroup()不會回滾。但實際上,這個函數回滾了,所有的事務都是回滾的?發生了什麼?。

我正在使用atomikos事務。

非常感謝

回答

1

如果您使用hibernate,請考慮這種情況。

當repoMember.save(A,B);執行時,hibernate會話沒有刷新會話(即執行save sql)util createMember()完成。當hibernate實際刷新並執行save sql時,會發生該錯誤。這就是爲什麼你可能無法捕獲導致事務回滾的異常。

這裏是鏈接可能會有所幫助 http://hedleyproctor.com/2014/08/understanding-hibernate-session-flushing/

2

如果有任何的方法拋出Exception,該交易將回滾。但是沒有一種方法投擲Exception。在catch塊中重新創建Exception,它將工作。請檢查Transactional註釋的文檔。

+0

感謝。但是,當我發現任何例外。事務仍然回滾?我不明白@。@。 –

+0

你是如何檢查事務是否回滾的?這可能是交易沒有承諾。檢查你的配置。 – Adi

+0

我認爲,雖然方法createMember()在保存到數據庫時遇到了麻煩(這裏我使用函數'saveAndFlush()')。我知道這一點,我發現了這個例外。 Prarent事務createGroupStudent()認爲它本身沒有問題並提交事務。但是,當再次提交方法createMember()將打破並拋出異常。我認爲createGroup()方法不會回滾。但實際上,這個函數是回滾的,所有的事務都是回滾的?發生了什麼 ???? 。這是我的問題:(我正在使用atomikos事務 –

相關問題