使用Spring、Hibernate和mySQL的事务管理,其他问题(使用Hibernate而不使用事务…)

使用Spring、Hibernate和mySQL的事务管理,其他问题(使用Hibernate而不使用事务…),mysql,hibernate,spring,transactions,Mysql,Hibernate,Spring,Transactions,我正在用SpringFramework3.0.5和HibernateFramework3.6开发一个Web应用程序,我有一些问题要问。我使用带有注释的事务管理。(@Transactional)并且我的DAO是在普通的Hibernate3API上编写的 1)我如何注意到事务被回滚?(我的意思是,我必须捕获异常?或者可能在之后检查,如果一切正常的话?用try-catch围绕@transactional方法对我来说似乎不是一件好事) 2)当我捕获异常时,使用@transactional的事务管理不起作

我正在用SpringFramework3.0.5和HibernateFramework3.6开发一个Web应用程序,我有一些问题要问。我使用带有注释的事务管理。(@Transactional)并且我的DAO是在普通的Hibernate3API上编写的

1)我如何注意到事务被回滚?(我的意思是,我必须捕获异常?或者可能在之后检查,如果一切正常的话?用try-catch围绕@transactional方法对我来说似乎不是一件好事)

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

3)是否可以在不使用事务的情况下使用Hibernate?所以我可以将Spring与Hibernate一起使用,但不使用事务管理

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

谢谢:-)

  • 如果使用@Transactional注释的方法引发运行时异常,Spring将自动回滚事务。您通常不关心它是否回滚,因为异常将传播到调用堆栈。如果确实需要知道事务是否回滚,请使用
    transactionspectsupport.currentTransactionStatus().isRollbackOnly()

  • 否。如果捕获从事务性方法引发的运行时异常,将回滚用于运行此方法的事务

  • 不需要。使用Hibernate需要事务,这是一件好事。在没有事务的情况下进行数据库工作会导致灾难

  • 是的,您需要一个事务引擎

  • 如果使用@Transactional注释的方法引发运行时异常,Spring将自动回滚事务。您通常不关心它是否回滚,因为异常将传播到调用堆栈。如果确实需要知道事务是否回滚,请使用
    transactionspectsupport.currentTransactionStatus().isRollbackOnly()

  • 否。如果捕获从事务性方法引发的运行时异常,将回滚用于运行此方法的事务

  • 不需要。使用Hibernate需要事务,这是一件好事。在没有事务的情况下进行数据库工作会导致灾难

  • 是的,您需要一个事务引擎


  • 非常感谢。我只是想理解为什么人们通常不关心事务是否回滚。例如,当用户想要注册但它不工作时,事务将回滚。但是因为我不知道,所以我不会通知用户。我认为这不是一个好策略。我将按照您的建议看一看“TransactionSpectSupport.currentTransactionStatus().isRollbackOnly()”。我还想知道为什么hibernates网页上有一篇文章描述了如何在没有事务的情况下访问数据,如果没有事务就无法使用hibernate:-)这就是我提到的文章。也许我误解了什么。。。?非常感谢!:-)@nano7:如果没有例外,那么事务没有回滚。如果出现异常,事务将回滚,异常将传播,直到在表示层中处理,并在该层中通知用户。如果没有异常,则无需进行回滚测试。真的(!)很抱歉再次重新启动。不知怎么的,我是个新手。您说过@transactional注释方法引发的异常将传播到调用堆栈。我可以在某个地方处理。如果不使用try/catch,如何获取此异常?也许是@ExceptionHandlers?真的很抱歉问你,但我真的不明白。如果你有一个例子或一个好的教程,我将非常感谢@nano7您可以在控制器层捕获异常。在设计良好的系统中,事务应该从服务层开始。当抛出异常时,控制器将捕获该异常并将视图重定向到错误页面,否则将继续呈现成功页面。谢谢!我只是想理解为什么人们通常不关心事务是否回滚。例如,当用户想要注册但它不工作时,事务将回滚。但是因为我不知道,所以我不会通知用户。我认为这不是一个好策略。我将按照您的建议看一看“TransactionSpectSupport.currentTransactionStatus().isRollbackOnly()”。我还想知道为什么hibernates网页上有一篇文章描述了如何在没有事务的情况下访问数据,如果没有事务就无法使用hibernate:-)这就是我提到的文章。也许我误解了什么。。。?非常感谢!:-)@nano7:如果没有例外,那么事务没有回滚。如果出现异常,事务将回滚,异常将传播,直到在表示层中处理,并在该层中通知用户。如果没有异常,则无需进行回滚测试。真的(!)很抱歉再次重新启动。不知怎么的,我是个新手。您说过@transactional注释方法引发的异常将传播到调用堆栈。我可以在某个地方处理。如果不使用try/catch,如何获取此异常?也许是@ExceptionHandlers?真的很抱歉问你,但我真的不明白。如果你有一个例子或一个好的教程,我将非常感谢@nano7您可以在控制器层捕获异常。在一个精心设计的系统中