@Transactional和@Transactional之间有什么区别(readOnly = true)

时间:2017-06-07 09:47:23

标签: java spring hibernate transactions

有人能告诉我spring / hibernate中 @Transactional @Transactional(readOnly = true)之间有什么区别。

为什么我们需要在服务层而不是DAO层中使用@Transactional / @ Transactional(readOnly = true)注释?

请告知

2 个答案:

答案 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