@Transactional 和 @Transactional(readOnly=true) 有啥区别
Posted
技术标签:
【中文标题】@Transactional 和 @Transactional(readOnly=true) 有啥区别【英文标题】:what is the difference between @Transactional and @Transactional(readOnly=true)@Transactional 和 @Transactional(readOnly=true) 有什么区别 【发布时间】:2017-11-08 14:22:00 【问题描述】:谁能告诉我 @Transactional 和 @Transactional(readOnly=true) 在 spring/hibernate 中有什么区别。
为什么我们需要在Service层而不是DAO层使用@Transactional/@Transactional(readOnly=true)注解?
请指教
【问题讨论】:
如果您正在修改事务中的任何数据,那么您可以使用@Transactional,即插入、更新等,并且只要您不修改任何数据,即(选择),您就可以使用@Transactional(readOnly=true ) 【参考方案1】:@Transactional
与 @Transactional(readOnly=true)
:
布尔值readOnly
是默认值,这意味着@Transactional
= @Transactional(readOnly=false)
,这实际上意味着您暗示该方法需要写访问权限。对于不需要修改数据的方法,您可以使用readOnly=true
对其进行注释。但是,这并不意味着使用注释会自动为您处理 - 您仍然需要设置实体管理器等以有效使用它。查看this page for more info.
我们把注解放在Service层而不是DAO层的一个主要原因是,我们通常在Service层定义业务逻辑,一个逻辑可能需要多个数据库交互,放在Service层封装所有数据库调用将在一个事务中完成(例如,如果失败,则回滚所有数据库调用等)。
【讨论】:
【参考方案2】:来自 Spring 文档:
如果事务是只读的,则为真。默认为假。
这只是作为实际事务子系统的提示;它 不一定会导致写访问尝试失败。一种 无法解释只读提示的事务管理器不会 当被要求进行只读事务时抛出异常,而不是 默默地忽略提示。
这意味着如果设置为“true”,readOnly 标志仅作为事务子系统的提示,即您的事务不会尝试修改任何数据。
@Transactional 注释主要用于服务层,因为您的业务方法可以包含许多您可能希望在一个事务中处理的 DAO 方法调用。
这个问题已经被问过了,您可以在此处阅读更多相关信息: Where should "@Transactional" be place Service Layer or DAO
【讨论】:
以上是关于@Transactional 和 @Transactional(readOnly=true) 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
@Transactional 与 JPA 和 Hibernate 有啥用?
在哪里使用@Transactional注解和@Repository注解