Harinath
Harinath

Reputation: 61

How does a transaction work with multiple DAOs, want to understand how single connection is shared

This might be a repeat but i couldn't find suitable post myself.

My question is, how does it really work (how the spring/hibernate support) to manage a single transaction with multiple DAO classes?

Does it really mean that same JDBC connection is used across multiple DAOs that are participating in a transaction? I would like to understand the fundamentals here.

Thanks in advance Harinath

Upvotes: 2

Views: 970

Answers (1)

Markus Coetzee
Markus Coetzee

Reputation: 3444

Using a simple example:

@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);
        ...
    }

    ...
}

In this example your controller has the overarching transaction, thus the entity manager will keep track of all operations in this operationX method and commit the transaction at the end of the method. Spring's @Transactional annotation creates a proxy for the annotated class which wraps it's methods in a transaction when called. It achieves this through the use of AOP.

Regarding the connection to the database - it is generally obtained from a connection pool and uses the connection for the duration of the transaction, whereafter it returns it to the connection pool. Similar question answered here: Does the Spring transaction manager bind a connection to a thread?

EDIT: Furthermore, for the duration of the transaction, the connection is bound to the thread. In subsequent database operations, the connection is obtained every time by getting the connection mapped to the thread in question. I believe the TransactionSynchronizationManager is responsible for doing this. The docs of which you can find here: TransactionSynchronizationManager

Upvotes: 2

Related Questions