使用JdbcTemplate时,是否需要显式配置事务?
我的代码布局如下所示:
我将有一个UserDao将被注入我的UserService,然后我的控制器将调用我的UserService中的方法。
我希望尽可能简化事务,并且我不需要多个数据库调用来跨越事务。
默认情况下,我是否必须在配置文件中执行任何操作或在任何位置使用@Transaction
注释?
现在在我的控制器中说我需要在我的userService和accountService上进行2次调用,我能以某种方式明确地将它包装在事务中吗?
userService.updateUser(user);
accountService.updateXXX(...);
答案 0 :(得分:25)
是的,JdbcTemplate
不能替代事务管理。您仍然可以从数据库事务中受益,因此userService.updateUser
将在数据库事务中运行,但如果accountService.updateXXX
失败,userService.updateUser
将不回滚。
如果您不想使用AOP,则可以使用TransactionTemplate代替。请参阅programmatic transaction management中的Spring Reference Documentation。
我之前见过的一种模式是MVC控制器类调用业务服务,它封装了操作。然后可以对业务类的方法进行注释@Transactional
。
答案 1 :(得分:12)
如果您的控制器想要对用户和帐户执行多项操作并在一个事务中完成所有这些操作,那么您应该拥有一个服务,其中一个方法可以完成所有这些操作。为每个DAO创建一个服务并不是一个好主意,因为您最终会在DAO周围执行无操作包装并且处理速度会很慢,因为数据库必须为每次调用DAO创建一个单独的事务,您正在制作它做了比它应该做的更多的工作。
服务应该为控制器或其他任何人调用它提供功能。我尝试创建服务的想法是服务提供对特定类型的用户有用的特定功能。