Spring 异常时事务回滚
Transaction rollback when exception in 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()
抛出异常时,事务总是回滚,为什么?我不明白发生了什么事!我在每个方法中添加了 try, catch 但它没有用。
虽然方法 createMember()
在保存到数据库时遇到问题(我在这里使用函数 saveAndFlush()
)。我知道它并且我捕获了那个异常。父事务createGroupStudent()
认为自己没有问题并提交事务。但是当再次提交时,方法 createMember()
将中断并抛出 Exception.I 认为方法 createGroup()
不会回滚。但实际上,那个函数回滚了,所有的交易都回滚了?发生了什么事?
我正在使用 atomikos 交易。
非常感谢
如果任何方法抛出 Exception
,事务将回滚。但是 none 的方法正在抛出 Exception
。重新抛出 catch 块中的 Exception
,它将 work.Check Transactional 注释的文档。
如果您正在使用休眠,请考虑这种情况。
当repoMember.save(A,B);执行时,hibernate session 尚未刷新会话(即执行 save sql)util createMember() 已完成。当休眠实际刷新并执行保存 sql 时,会发生该错误。这就是为什么您可能无法捕获导致事务回滚的异常。
这里 link 可能会有帮助
http://hedleyproctor.com/2014/08/understanding-hibernate-session-flushing/
我正在学习 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 但它没有用。
虽然方法 createMember()
在保存到数据库时遇到问题(我在这里使用函数 saveAndFlush()
)。我知道它并且我捕获了那个异常。父事务createGroupStudent()
认为自己没有问题并提交事务。但是当再次提交时,方法 createMember()
将中断并抛出 Exception.I 认为方法 createGroup()
不会回滚。但实际上,那个函数回滚了,所有的交易都回滚了?发生了什么事?
我正在使用 atomikos 交易。
非常感谢
如果任何方法抛出 Exception
,事务将回滚。但是 none 的方法正在抛出 Exception
。重新抛出 catch 块中的 Exception
,它将 work.Check Transactional 注释的文档。
如果您正在使用休眠,请考虑这种情况。
当repoMember.save(A,B);执行时,hibernate session 尚未刷新会话(即执行 save sql)util createMember() 已完成。当休眠实际刷新并执行保存 sql 时,会发生该错误。这就是为什么您可能无法捕获导致事务回滚的异常。
这里 link 可能会有帮助 http://hedleyproctor.com/2014/08/understanding-hibernate-session-flushing/