Если ты используешь EJB, то все запросы от ORM к БД оборачиваются в транзакцию, если тип в persistence-unit добавить аттрибут
transaction-type="JTA
. Иначе транзакциями
вручную будешь рулить. Достаточно лишь получить транзакцию, ну и начать/закоммитить/сделать роллбек. Менеджер транзакций уже настроен. Если не используешь EJB, а обходишься спрингом, то в нём есть свой менеджер трнзакций, хз, надо ли его отдельно конфигурить.
Вот эти самые менеджеры транзакций и менеджеры ресурсов и рулят потоками, пулами соединений и т.д. Он сам отслеживает любые попытки обращения к БД и оборачивает в транзакцию (если есть запущенная транзакция, при чём неважно, запустил ты её сам, или сервер приложений это сделал за тебя). Эти менеджеры поддерживают как локальные, так и распределённые транзакции, и, при этом, всё потокобезопасно.
Если не используешь JPA и EntityManager, только Hibernate, то можно взять реализацию менеджера транзакций, например
Atomikos, сконфигурить и создать его ручную, а потом так же вручную запускать транзакции.
Использовать 1 транзакцию на всё приложение глупо. Пропадёт многопоточность (ведь 1 транзакцию нельзя к нескольким потокам привязать), да и много действий внутри 1 транзакции делать плохо.
В общем, нужно использовать всё с умом. Если нужны транзакции - используй. Только правильно: в 1 транзакции должно быть 1 логическая операция.
PS Ах да, если я не ошибаюсь, то количество потоков зависит больше от менеджера ресурсов, а не от менеджера транзакций. Ресурсами же могут быть, например, БД, а могут и сообщения JMS.
Как настроишь DataSource, так и будет.