@控制器方法上的事务不起作用

问题描述 投票:0回答:2

在我的 Spring MVC 应用程序中,我在控制器中有一个方法,需要将一堆对象(从上传的文件构建)保存到数据库中。让我们暂时把关于事务是否应该在控制器或服务层中完成的整个问题放在一边——重点是在控制器中完成它在技术上应该是可行的,但我发现了问题。 如果您查看下面的代码,我期望的是,如果对 saveContact 的三个调用中的任何一个因异常而失败(任何异常,因为我放置了 rollbackFor = Exception.class ),那么所有三个调用都应该回滚。不过,我看到的是,如果第三个失败,前两个的数据仍然存在于数据库中。抛出的异常是 PersistenceException,所以我相信这应该触发回滚,但它没有(它冒泡到客户端的浏览器,这是我所期望的,因为我没有捕获它)。

code removed for security reasons

谢谢

java spring hibernate transactions controller
2个回答
2
投票

使用proxy-target-class =“true”,您告诉spring使用cglib来处理代理,但您已经指定了scoped-proxy =“interfaces”。

https://stackoverflow.com/a/15568457/117839


1
投票
该方法上的

@Transactional
没有任何附加值,因为它是内部方法调用(并且您的类已经是事务性的)。 Spring 使用代理,并且仅通过代理调用对象。

您的代码也有缺陷,您不应该捕获并吞下异常,因为这会干扰 tx 支持(它依赖于事务来确定是否回滚,目前从来没有异常,因此总是尝试提交)。

最后,您在使用 MySQL 时请确保您使用的表类型确实支持事务(MyISAM 表不支持 tx)。

但是,我强烈建议将事务部分(或您现在在控制器中执行的业务逻辑)移动到服务中。控制器(或一般的 Web 层)应该只是一个薄层,将传入请求转换为可用于服务层的内容,并将结果转换为可用于 Web 显示的内容。

© www.soinside.com 2019 - 2024. All rights reserved.