有人能告诉我spring / hibernate中 @Transactional 和 @Transactional(readOnly = true)之间有什么区别。
为什么我们需要在服务层而不是DAO层中使用@Transactional / @ Transactional(readOnly = true)注释?
请告知
答案 0 :(得分:1)
@Transactional
vs @Transactional(readOnly=true)
:
默认情况下,布尔值readOnly
,这意味着@Transactional
= @Transactional(readOnly=false)
,这实际上意味着您暗示该方法需要写入权限。对于不需要数据修改的方法,您可以使用readOnly=true
对其进行注释。这并不意味着使用注释会自动为您处理 - 但您仍然需要设置实体管理器等以有效地使用它。查看this page for more info.
我们将注释放在服务层而不是DAO层上的一个主要原因是我们通常在服务层上定义业务逻辑,逻辑可能需要多个数据库交互,并在服务层上封装它所有db调用都将在一个事务中完成(例如,如果失败则对所有db调用进行回滚等)。
答案 1 :(得分:0)
来自Spring文档:
如果事务是只读的,则为true。默认为false。
这只是实际交易子系统的提示;它 不一定会导致写访问尝试失败。一个 事务管理器不能解释只读提示 当被要求进行只读事务时抛出异常而是 默默地忽略提示。
这意味着readOnly标志(如果设置为'true')仅用作事务子系统的提示,您的事务不会尝试修改任何数据。
@Transactional注释主要用于服务层,因为您的业务方法可以包含许多您可能希望在一个事务中处理的DAO方法调用。
此问题已经提出,您可以在此处详细了解: Where should "@Transactional" be place Service Layer or DAO