【问题标题】:Transaction Management with Spring, Hibernate and mySQL, additional questions (using hibernate without transactions..)使用 Spring、Hibernate 和 mySQL 进行事务管理,附加问题(使用没有事务的 hibernate..)
【发布时间】:2011-08-05 13:50:05
【问题描述】:

我正在使用 Spring Framework 3.0.5 和 Hibernate Framework 3.6 开发一个 web 应用程序,我有一些问题。我使用带有注释的事务管理。 (@Transactional) 并且我的 DAO 是用普通的 Hibernate 3 API 编写的。

1) 我怎样才能注意到事务已回滚? (我的意思是,我确实必须捕获异常?或者可能在一切正常后检查一下?用 try-catch 包围 @transactional-methods 对我来说似乎不是一件好事)

2) 当我捕捉到异常时,使用@transactional 进行事务管理不起作用(不是回滚)是否正确? (当我用 try-catch 包围事务方法的调用时)

3) 是否可以在不使用事务的情况下使用 Hibernate?所以我可以使用 Spring 和 Hibernate 但没有事务管理?

4) 如果不使用事务就无法使用 Hibernate,这意味着我的数据库管理系统必须始终支持事务引擎(如 InnoDB)。那么我不能将 myISAM 表与休眠一起使用吗?那么这将是hibernate的一大缺点!?

谢谢你:-)

【问题讨论】:

    标签: mysql hibernate spring transactions


    【解决方案1】:
    1. 如果使用 @Transactional 注释的方法抛出运行时异常,Spring 将自动回滚事务。您通常不关心它是否回滚,因为异常会传播到调用堆栈。如果您确实需要知道事务是否回滚,请使用TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()

    2. 没有。如果您捕获从事务方法抛出的运行时异常,则用于运行此方法的事务将回滚。

    3. 没有。您需要事务才能使用 Hibernate,这是一件好事。在没有事务的情况下进行数据库工作是灾难的根源。

    4. 是的,您需要一个事务引擎。

    【讨论】:

    • 谢谢!我只是想了解为什么人们通常不关心事务是否回滚。例如,当用户想注册但它不工作时,事务被回滚。但由于我不会意识到这一点,我不会通知用户。我不认为这是一个好策略。按照您的建议,我将查看“TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()”。我还想知道为什么在休眠网页上有一篇文章描述了如何在没有事务的情况下访问数据,如果没有事务就无法使用休眠:-)
    • 这是我提到的那篇文章。 community.jboss.org/wiki/…也许我误会了什么……?到目前为止感谢! :-)
    • @nano7: 如果没有异常,那么事务没有回滚。如果有异常,事务将回滚并且异常将传播,直到它在表示层中被处理,在那里可以通知用户。如果没有异常,则无需测试回滚。
    • 真的(!)抱歉再次询问。我不知何故是个新手。您说@transactional-annotated 方法引发的异常将传播到调用堆栈。然后我可以在某个地方处理它。如果不使用 try/catch,我如何获得此异常?也许与@ExceptionHandlers?真的很抱歉问,但我根本不明白。有没有例子或好的教程,不胜感激!
    • @nano7 可以在控制器层捕获异常。在一个设计良好的系统中,您的事务应该从服务层开始。当抛出异常时,控制器会捕获它并将视图重定向到错误页面,否则继续呈现成功页面。
    猜你喜欢
    • 2011-08-04
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2012-10-16
    • 2016-12-02
    • 2011-08-08
    相关资源
    最近更新 更多