@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) 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

@Async 和 @Transactional:不工作

@Transactional 与 JPA 和 Hibernate 有啥用?

spring 和@transactional,这正常吗?

在哪里使用@Transactional注解和@Repository注解

为hibernate和@Transactional配置spring数据源

spring @Transactional 事务注解的坑