我正在学习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()
抛出异常时,事务总是回滚为什么?我无法理解发生了什么!我添加了try,catch in each methods但它没有工作。
虽然方法createMember()
在保存到数据库时遇到问题(这里我使用函数saveAndFlush()
)。我知道它并且我抓住了那个例外。父事务createGroupStudent()
认为自己没有问题并且提交事务。但是当再次提交时,方法createMember()
将会中断并抛出异常。我认为方法createGroup()
不会回滚。但实际上,该函数回滚,所有事务都回滚了吗?发生了什么事??
我正在使用atomikos交易。
非常感谢
答案 0 :(得分:2)
如果任何方法抛出Exception
,则事务将回滚。但是这些方法都没有抛出Exception
。重新抛出catch块中的Exception
,它将起作用。检查Transactional注释的文档。
答案 1 :(得分:1)
如果您正在使用休眠,请考虑这种情况。
当repoMember.save(A,B);执行后,hibernate会话没有刷新会话(即执行save sql)util createMember()完成。当hibernate实际刷新并执行save sql时,会发生该错误。这就是为什么你可能无法捕获导致事务回滚的异常的原因。
这里是可能有用的链接 http://hedleyproctor.com/2014/08/understanding-hibernate-session-flushing/