Es ist besser, die @Transaktional in einer separaten mittleren Schicht zwischen DAO und Service Layer. Da Rollback sehr wichtig ist, können Sie alle Ihre DB-Manipulationen in der mittleren Schicht unterbringen und die Geschäftslogik in der Dienstschicht schreiben. Die mittlere Schicht wird mit Ihren DAO-Schichten interagieren.
Dies wird Ihnen in vielen Situationen helfen, z. B. ObjectOptimisticLockingFailureException - Diese Ausnahme tritt erst ein, wenn Ihre Transaktion beendet ist. Sie können sie also nicht in der mittleren Schicht abfangen, aber Sie können sie jetzt in Ihrer Dienstschicht abfangen. Dies wäre nicht möglich, wenn Sie @Transactional in der Serviceschicht haben. Sie können zwar im Controller abfangen, aber der Controller sollte so sauber wie möglich sein.
Wenn Sie Mails oder SMS in einem separaten Thread senden, nachdem Sie alle Optionen zum Speichern, Löschen und Aktualisieren abgeschlossen haben, können Sie dies im Dienst tun, nachdem die Transaktion in Ihrer mittleren Schicht abgeschlossen ist. Auch hier gilt: Wenn Sie @Transactional in der Service-Schicht angeben, wird Ihre Mail auch dann verschickt, wenn Ihre Transaktion fehlschlägt.
Eine mittlere @Transaktionsschicht wird also dazu beitragen, dass Ihr Code besser und einfacher zu handhaben ist. Ansonsten, Wenn Sie in der DAO-Schicht arbeiten, können Sie möglicherweise nicht alle Vorgänge zurücknehmen. Wenn Sie in der Service-Schicht verwenden, müssen Sie möglicherweise AOP (Aspect Oriented Programming) in bestimmten Fällen.