29

使用 JdbcTemplate 时,是否需要显式配置事务?

我的代码布局如下所示:

我将有一个将被注入到我的 UserService 中的 UserDao,然后我的控制器将调用我的 UserService 中的方法。

我想让事情尽可能简单的事务,我不需要多个数据库调用来跨越一个事务。

默认情况下,我是否必须在我的配置文件中做任何事情或在@Transaction任何地方使用注释?

现在说在我的控制器中我需要对我的 userService 和 accountService 进行 2 次调用,我可以以某种方式明确地将它包装在事务中吗?

userService.updateUser(user);
accountService.updateXXX(...);
4

2 回答 2

35

是的,JdbcTemplate不能代替事务管理。你仍然受益于数据库事务,所以userService.updateUser会在数据库事务中操作,如果accountService.updateXXX失败,userService.updateUser不会回滚。

如果不想使用 AOP,可以使用TransactionTemplate代替。请参阅Spring 参考文档中的程序化事务管理

我以前见过的一种模式是 MVC 控制器类调用业务服务,该服务封装了操作。然后可以对业务类的方法进行注释@Transactional

于 2012-09-28T14:14:16.250 回答
16

如果您的控制器想要对用户和帐户做几件事,并且所有这些都发生在一个事务中,那么您应该使用一种方法来完成所有这些事情。为每个 DAO 创建一个服务并不是一个好主意,因为您最终会得到围绕 DAO 的无操作包装器,并且处理速度会很慢,因为数据库必须为对 DAO 的每次调用创建单独的事务,您正在这样做比它应该做的工作要多得多。

该服务应该为控制器或其他调用它的人提供功能。我尝试创建服务的想法是,服务提供对特定类型用户有用的特定功能。

于 2012-09-28T14:29:07.370 回答