这可能是重复,但我自己找不到合适的帖子。
我的问题是,如何管理具有多个DAO类的单个事务真的有效(Spring / hibernate如何支持)?
这是否真的意味着在参与事务的多个DAO中使用相同的JDBC连接?我想了解这里的基本原理。
提前致谢 Harinath
答案 0 :(得分:1)
使用一个简单的例子:
@Controller
@Transactional
@RequestMapping("/")
public class HomeController {
@Inject
private UserRepository userRepository;
@Inject
private TagRepository tagRepository;
...
@RequestMapping(value = "/user/{user_id}", method = RequestMethod.POST)
public @ResponseBody void operationX(@PathVariable("user_id") long userId) {
User user = userRepository.findById(userId);
List<Tags> tags = tagRepository.findTagsByUser(user);
...
}
...
}
在此示例中,您的控制器具有总体事务,因此实体管理器将跟踪此operationX方法中的所有操作,并在方法结束时提交事务。 Spring的@Transactional
注释为注释类创建一个代理,它在调用时将它的方法包装在事务中。它通过使用AOP来实现这一目标。
关于与数据库的连接 - 通常从连接池获取并在事务持续时间内使用连接,然后将其返回到连接池。类似的问题在这里回答:Does the Spring transaction manager bind a connection to a thread?
修改强> 此外,在事务持续期间,连接绑定到线程。在后续数据库操作中,每次通过获取映射到相关线程的连接来获取连接。我相信TransactionSynchronizationManager负责这样做。您可以在此处找到的文档:TransactionSynchronizationManager