首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Spring 3/Hibernate中回滚事务的最佳实践

在Spring 3/Hibernate中回滚事务的最佳实践
EN

Stack Overflow用户
提问于 2010-12-10 03:56:18
回答 5查看 33.8K关注 0票数 19

引用Spring documentation

任何RuntimeException都会触发回滚,任何选中的异常都不会

引用javapractices.com

未检查的异常:

  • 代表了程序中的缺陷(Bug)--通常是传递给非私有方法的无效参数。引用Gosling、Arnold和Holmes的《Java》中的一句话:“一般来说,未检查的运行时异常表示的条件反映了程序逻辑中的错误,无法在运行时合理地恢复。”
  • 是运行时异常的子类,通常使用IllegalArgumentException、NullPointerException或IllegalStateException
  • a方法来实现,因此没有义务为其实现抛出的未检查的异常建立策略(它们几乎总是不这样做)

检查到的异常:

  • 表示程序无法直接控制的区域中的无效条件(无效用户输入、数据库问题、网络中断、缺少文件)
  • 是exception
  • 的子类。方法必须为其实现抛出的所有已检查异常建立策略(要么将已检查异常向上传递,要么以某种方式处理它)

如果在我的业务逻辑中我发现了一个问题,并且我想回滚更改,我必须抛出一个新的RuntimeException?这并不是真正的RuntimeException (未检查的异常),因为我已经在逻辑中标识了它。或者也许我误解了这些概念?

我真正的问题是,在我的@服务方法中回滚事务的最佳实践是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-10 04:32:42

如果使用检查异常,只需将它们添加到@Transactional注释的rollbackFor属性中即可。

代码语言:javascript
复制
@Transactional(rollbackFor = { MyInvalidUserException.class, MyApplicationException.class })
public void method() throws MyInvalidUserException,  MyApplicationException { 
    ... 
    ... 
}

等。

fine的答案也很好用。如果您想要将编程事务管理混合到声明性事务中,或者让它保持严格的声明性,这是一个学术决定。

票数 12
EN

Stack Overflow用户

发布于 2012-08-16 06:37:16

从以下内容中以编程方式回滚:

代码语言:javascript
复制
@Transactional
public void commit() {
  try {
    // some business logic...
  } catch (ConstraintViolationException e) {
    // trigger rollback programmatically
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  }
}

或者将异常标记为回滚,并从调用方处理它:

代码语言:javascript
复制
@Transactional(rollBackFor = TransactionException.class)
public void commit() throws ConstraintViolationException{
    try {
    // some business logic...
  } catch (ConstraintViolationException e) {
    // handle the exception 
    // re-throw for rollback
    new TransactionException(e);
  }
}

public void doCommit(){
  try {
    commit()
  } catch (TransactionException e){
    // do nothing as already handled
  }
}

我更喜欢前者,因为它使代码更简单,但根据Spring文档,它是discouraged

如果您绝对需要的话,

可编程回滚是可用的,但是它的使用与实现一个干净的基于POJO的体系结构相冲突。

票数 7
EN

Stack Overflow用户

发布于 2010-12-10 04:09:48

它应该是这样的

代码语言:javascript
复制
@Transactional
public void method () throws YourCustomException  {
   try{
           //logic  
   }catch(Exception ex){
             TransactionAspectSupport.currentTransactionStatus()
                        .setRollbackOnly();
             throw(new YourCustomException(ex.getMessage()));
   }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4402506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档