Spring的JdbcTemplate和事务处理

30

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

我的代码结构如下:

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

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

默认情况下,我需要在配置文件中做任何事情或在任何地方使用@Transaction注释吗?

现在假设在我的控制器中,我需要对我的userService和accountService进行2个调用,我能否显式地将它包装在一个事务中?

userService.updateUser(user);
accountService.updateXXX(...);
4个回答

39
是的,JdbcTemplate不能替代事务管理。您仍然可以从数据库事务中受益,因此userService.updateUser将在数据库事务中操作,但如果accountService.updateXXX失败,userService.updateUser不会回滚。
如果您不想使用AOP,则可以使用TransactionTemplate。请参见Spring参考文档中的编程式事务管理
我以前见过一种模式,即MVC控制器类调用业务服务,该服务封装了操作。然后,业务类的方法可以被注释为@Transactional

3
哇,这是一大段交易代码,@Transactional 能够减少编写样板代码的工作量! - loyalflow
如果你需要访问“TransactionStatus”,那么这很有用,虽然它不起眼。 - David Grant
2
对于这个商业服务想法,我给出一分好评。在我看来,如果每个人都这样做,生活会更加轻松。 - xdhmoore
我只想知道PlatformTransactionManager如何与jdbcTemplate建立关系,因为它们都有一个数据源。 - deFreitas
2
如何在jdbcTemplate中使用AOP?我看到一些示例需要一个JpaTransactionManager依赖项,但是对于jdbcTemplate来说,JPA是否正确? - User

17

如果您的控制器想要与用户和账户进行多个操作,并且希望在一个事务中完成所有操作,那么您应该创建一个具有执行所有这些操作的方法的服务。为每个DAO创建一个服务不是一个好主意,因为您最终会得到围绕DAO的无用包装器,并且处理速度会很慢,因为数据库必须为对DAO的每次调用创建一个单独的事务,您让它做了比它应该做的更多的工作。

该服务应为控制器或其他调用方提供功能。我试图创建服务,并通过服务为某种类型的用户提供特定的、有用的功能。


1
+1 赞同。这样做可以使许多事情变得更容易,包括测试,并且如果您需要将任何功能暴露给除控制器以外的其他视图(例如REST API),也很容易实现。 - xdhmoore

1

Spring JdbcTemplate 完全不知道事务。如果您没有以任何方式进行事务配置 - 通常通过 PlatformTransactionManagerTransactionTemplate(它只是 PlatformTransactionManager 的更高级别的 API),或使用声明性方法,通过注释,如 Spring @Transactional - 那么由 JdbcTemplate 发出的每个 SQL 查询都将在任何事务之外运行。因此,是的,需要进行事务配置。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接