My Question is with DB connection Boundry vs Transaction Boundry
I am not asking, where to put @transactional annotation. I need to know even code the executed @transactional method, After that also Is it using db connection/lock or not?
Story 
I have faced problem with one of my project is consuming lot of DB connections. And those are not releasing when web-traffic is high.
So I need to know the best practice of transactional annotation usage. 
Also, I need Detail Explanation Lock/DB connection with @Transactional | 
what is DB connection? What is lock ? are both equal? I am asking about lock acquiring.when the lock is acquiring and when the lock is releasing.
I have 2 approaches to return data from the transactional method.
- save and return entity 
- save and return DTO 
which is the better approach by considering DB connection/lock perspective.
controller layer
@Controller
public class QuoteController {
    @RequestMapping(value ="", method = RequestMethod.POST)
    public String saveAllGetSampleClass4(QuoteDTO quoteDTO, RedirectAttributes redirectAttributes) {
        quoteService.saveAllGetSampleClass4(quoteDTO.quoteId, quoteDTO.userId);
    }
    @RequestMapping(value ="", method = RequestMethod.POST)
    public String saveAllGetSampleClass4DTO(QuoteDTO quoteDTO, RedirectAttributes redirectAttributes) {
        quoteService.saveAllGetSampleClass4DTO(quoteDTO.quoteId, quoteDTO.userId);
    }
}
service layer
========================
@Service
public class QuoteService {
   @Transactional
    public SampleClass4 saveAllGetSampleClass4(Long quoteId, Long userId) {        
        SampleClass1 sampleClass1 = new SampleClass1();
        sampleClass1.setQuoteId(quoteId);
        sampleRepository1.saveAndFlush(sampleClass1);
        SampleClass2 sampleClass2 = new SampleClass2();
        sampleClass2.setQuoteId(quoteId);
        sampleRepository2.saveAndFlush(sampleClass2);
        SampleClass3 sampleClass3 = new SampleClass3();
        sampleClass3.setQuoteId(quoteId);
        sampleRepository3.saveAndFlush(sampleClass3);
        SampleClass4 sampleClass4 = new SampleClass4();
        sampleClass4.setQuoteId(quoteId);
        sampleClass4=sampleRepository4.saveAndFlush(sampleClass4);
    }
   @Transactional
    public SampleClass4DTO saveAllGetSampleClass4DTO(Long quoteId, Long userId) {        
        SampleClass1 sampleClass1 = new SampleClass1();
        sampleClass1.setQuoteId(quoteId);
        sampleRepository1.saveAndFlush(sampleClass1);
        SampleClass2 sampleClass2 = new SampleClass2();
        sampleClass2.setQuoteId(quoteId);
        sampleRepository2.saveAndFlush(sampleClass2);
        SampleClass3 sampleClass3 = new SampleClass3();
        sampleClass3.setQuoteId(quoteId);
        sampleRepository3.saveAndFlush(sampleClass3);
        SampleClass4 sampleClass4 = new SampleClass4();
        sampleClass4.setQuoteId(quoteId);
        sampleClass4=sampleRepository4.saveAndFlush(sampleClass4);
        SampleClass4DTO dto=SampleClass4DTO.valueOf(sampleClass4);
        return dto; 
    }
}
