本文正在参加「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…