[英]SpringBoot Transactional annotation Propagation on Class to Class level
我有3個類和一些方法,A類有一個方法
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
從這個方法中,我叫class2
> methodA
從這個方法class3
methodA
調用,在這種method
DB插入操作完成。
在class2
methodA
有一個例外,因此我必須回退在Class3
methodA
發生的整個事務。
但沒有任何回滾。 我在這里缺少什么嗎?或者我對@Transactional
Propagation的理解是錯誤的?
A級
@Transactional(propagation = Propagation.REQUIRED,
rollbackFor = Exception.class)
public class classA {
public DTObject callUpdateValues(DTObject _dtoobject) throws Exception {
DTObject _resultDTO = null;
ClassB m = new ClassB();
_resultDTO= m.updateValues(_dtoobject);
return _resultDTO;
}
}
B級
@Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class )
public class ClassB {
String Option;
public ClassB() {
super();
// TODO Auto-generated constructor stub
}
public DTObject updateValues(DTObject ClassCMap) throws Exception
{
addClassC(ClassCMap);
if(true) //custom exception
{
throw new Exception("Hello exception");
}
ReturnResult.setValue( SUCCESS_FAILURE_KEY ,SUCCESS_VALUE);
return ReturnResult;
}
private void addClassC(DTObject dtoobject) throws Exception
{
try
{
ClassC ClassC = new ClassC();
ClassCManager ClassCmanager = new ClassCManager(_COLLECTIONObj,V_LOG_REQ,V_ADD_LOG_REQ);
ClassC.setClassCId(dtoobject.getValue("ClassC_ID"));
ClassC.setClassCDescn(dtoobject.getValue("ClassC_DESCN"));
ClassC.setClassCModule(dtoobject.getValue("ClassC_MODULE"));
ClassC.setClassCClass(Integer.parseInt(dtoobject.getValue("ClassC_CLASS")));
ClassC.setClassCProgramIdentifier(dtoobject.getValue("ClassC_PROGRAM_IDENTIFIER"));
char menuStatus=dtoobject.getValue("ClassC_REQUIRED_IN_MENU").charAt(0);
ClassC.setClassCRequiredInMenu(menuStatus);
char finStatus=dtoobject.getValue("ClassC_FIN_NONFIN_OPTION").charAt(0);
ClassC.setClassCFinNonfinOption(finStatus);
ClassC.setClassCAuthReqd(stringToChar(dtoobject.getValue("ClassC_AUTH_REQD")));
ClassC.setClassCDblAuthReqd(stringToChar(dtoobject.getValue("ClassC_DBL_AUTH_REQD")));
ClassC.setClassCTransitChoice(stringToChar(dtoobject.getValue("ClassC_TRANSIT_CHOICE")));
ClassC.setClassCUnauthNextDay(stringToChar(dtoobject.getValue("ClassC_UNAUTH_NEXT_DAY")));
ClassC.setClassCRejAllDuringEod(stringToChar(dtoobject.getValue("ClassC_REJ_ALL_DURING_EOD")));
ClassC.setClassCTableName(dtoobject.getValue("ClassC_REJ_ALL_DURING_EOD"));
Set_Entd_Dtls(ClassC);
ClassC.setIsNew(true);
ClassCmanager.save(ClassC);
}catch(Exception e)
{
throw new Exception(e.getLocalizedMessage());
}
}
}
C級
@Transactional(propagation = Propagation.NESTED)
public class ClassCmanager extends Manager
{
public void save(Mpgm obj, Connection _conn) throws SQLException {
CRUD operation
}
}
您需要一個嵌套在Class2和Class3中的事務,這將使用Class1事務。
// Class1
@Transactional(propagation=Propagation.REQUIRED, ...)
// Class2 & Class3
@Transactional(propagation=Propagation.NESTED)
如果您不使用AspectJ,請嘗試使您的類服務(用@Service注釋)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.