@Transactional注解到底该写在哪里?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:@Transactional注解到底该写在哪里?

@Transactional是应该写在DAO层的类上还是方法上?还是写在调用了DAO层对象的Service上好?又或者对这两层都注解一下有意义吗?

回答一

我认为事务属于Service层。因为这一层有工作单元和用例。如果你有许多Dao对象要注入到Service协同工作,那么这是一个正确的答案。

回答二

一般来说,我同意其他人的说法,即事务通常是在Service级别上启动的(当然,这取决于你需要的粒度)。

然而,与此同时,我也开始将@Transactional(propagation=propagation.MANDATORY)添加到我的DAO层(以及不允许启动事务但需要现有事务的其他层),因为在调用方(例如Service)中,如果忘记启动事务,则更容易检测错误。如果你的DAO带有强制传播的注解,那么你将得到一个异常,说明调用该方法时没有活动事务。

我还进行了一个集成测试,在该测试中,我检查所有bean中是否有此注解,如果在不属于服务层的bean中存在传播不是必需的@Transactional注解,则会失败。这样我可以确保我们不会在错误的层上启动事务。

回答三

对于数据库级别的事务

我把@Transactional主要用在DAO层的方法上。所以可以专门为方法设置为default(required)

DAO层get/select数据时,不需要使用事务。但是事务拦截器/AOP同样会导致一些开销。

DAO层的insert/update将会需要使用@Transactional注解。

对于应用级别的事务

我喜欢把事务处理放在业务代码上,我希望在发生错误的情况下可以回滚。

文章翻译自Stack Overflow:stackoverflow.com/questions/1…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享