事务如何与多个DAO一起工作,希望了解如何共享单个连接

时间:2013-11-26 17:37:34

标签: spring transactions

这可能是重复,但我自己找不到合适的帖子。

我的问题是,如何管理具有多个DAO类的单个事务真的有效(Spring / hibernate如何支持)?

这是否真的意味着在参与事务的多个DAO中使用相同的JDBC连接?我想了解这里的基本原理。

提前致谢 Harinath

1 个答案:

答案 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