我一直在寻找这个问题,在StackOverflow和Google上有很多这样的问题,但我似乎无济于事。

这是我的验证码 春季配置:(我不使用任何切入点-我想我不需要吗?) 通用标签

我有一个Service类: 通用标签

和道课: 通用标签

假定代码可以正常工作,则消除了一些不必要的细节(例如,缺少设置器等)。

上述问题是,当我添加throw随机异常行时,它不会回滚,通过DAO持久化的对象保留在数据库中。

我正在使用Spring 3.1和Hibernate 3.6(因为Spring 3.1上的Hibernate 4.0存在一个错误)

有想法吗?

谢谢

有帮助吗?

解决方案 2

我找到了问题的原因,以及为什么交易(貌似)管理不当。

我的代码中的某个地方 通用标签

它说“-这里有一些逻辑-”的部分,已经完成了一些使用原始SQL并调用执行更新的逻辑: 通用标签

并且由于它没有使用Hibernate查询,而是使用原始SQL执行,因此导致调用了flush,因此在调用之前完成的所有工作将与 它。

我重新处理逻辑流程以解决此逻辑问题,以确保正确管理事务。使用原始SQL可能表明存在错误-由于服务试图完成并提高服务性能,因此必须执行某些操作。

其他提示

这是事务管理的预期行为。 @Transactional的默认行为是仅针对运行时异常回滚。 如果您想在引发DaoException后回滚您的东西,则将其添加到回滚异常列表中。别忘了还包括RuntimeException。 在Dao类上尝试以下操作 @Transactional(propagation= Propagation.Mandatory,rollbackFor= {RuntimeException.class,DaoException.class})

尝试从DaoImpl类中删除@Transactional批注。我怀疑可能发生的情况是,当事务越过该事务边界(DaoImpl)时,该事务正在提交。我在此设置上取得了不同的成功。您可以尝试一些不同的交易方式来进行“内部”交易。

您可以做的另一件事是打开spring事务日志记录。它认为其类别为org.springframework.transaction或其他内容。这样一来,您将确切了解回滚和提交事务的操作。

您没有默认情况下处于AUTOCOMMIT模式的JDBC驱动程序之一,对吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top